分类: Python/Ruby
2011-06-20 16:08:31
关于 "_"
是一个非常有用的功能,但是却很少有人知道。
当你在交互式模式下(如 IDEL)计算一个表达式或调用一个函数后,其结果必然是一个临时名称,_(下划线):
1. >>> 1 + 1
2. 2
3. >>> _
4. 2
在 _ 中存储最后输出的值。
当输出的结果是
None 或没有任何输出时,而
_ 的值并不会改变,仍然保存上一次的值。这就是方便所在。
当然,这只能交互式的模式中使用,在模块中不能支持。
这在交互式模式中是非常有用的,当你在过程中没有保存计算结果 或 你想看最后一步的执行的输出结果:
1. >>> import math
2. >>> math.pi / 3
3. 1.0471975511965976
4. >>> angle = _
5. >>> math.cos(angle)
6. 0.50000000000000011
7. >>> _
8. 0.50000000000000011
创建String: 从列表中创建
开始定义一个
string 列表:
1. colors = ['red', 'blue', 'green', 'yellow']
当我们需要将上面的列表连接成一个字符串。尤其当 list 是一个很大的列表时....
不要这样做:
1. result = ''
2. for s in colors:
3. result += s
这种方式效率非常低下的,它有可怕的内存使用问题,至于为什么,如果你是 javaer 的话,其中的 string 连接,我想你并不陌生。
相反,你应该这样做:
1. result = ''.join(colors)
当你只有几十或几百个string项连接时,它们效率上并不会太大的差别。但你要在养成写高效代码的习惯,因为当字符串数千时,join 比起 for 连接性能会能有所提升。
如果你需要使用一个函数来生成一个字符串列表,同样可以使用:
1. result = ''.join(fn(i) for i in items)
尽可能的使用
Good:
1. for key in d:
2. print key
· 使用 in 一般情况下是非常快的。
·
这种方式也适用于其它的容器对象(如 list,tuple 和 set)。
·
in 是操作符(正如上面所看到的)。
Bad:
1. for key in d.keys():
2. print key
保持与上面的一致性,使用
use key in dict 方式,而不是 dict.has_key():
1. # do this:
2. if key in d:
3. ...do something with d[key]
4.
5. # not this:
6. if d.has_key(key):
7. ...do something with d[key]
字典中的 get 函数
我们经常需要在字典中初始化数据:
以下是不好的实现方法:
1. navs = {}
2. for (portfolio, equity, position) in data:
3. if portfolio not in navs:
4. navs[portfolio] = 0
5. navs[portfolio] += position * prices[equity]
使用dict.get(key,
default) 删除
if 判断代码:
1. navs = {}
2. for (portfolio, equity, position) in data:
3. navs[portfolio] = (navs.get(portfolio, 0)
4. + position * prices[equity])
这种方式更为直接。
字典中的 setdefault 函数 (1)
当我们要初始化一个可变字典的值。每个字典的值将是一个列表。下面是不好的做法:
初始化可变字典的值:
1. equities = {}
2. for (portfolio, equity) in data:
3. if portfolio in equities:
4. equities[portfolio].append(equity)
5. else:
6. equities[portfolio] = [equity]
通过
dict.setdefault(key, default) 使这段代码工作的更好:
1. equities = {}
2. for (portfolio, equity) in data:
3. equities.setdefault(portfolio, []).append(
4. equity)
dict.setdefault()等同于“ get, or set & get“ 或"如果没有,就设置"; 如果你的字典Key是复杂的计算或long类型,使用 setdefault 是特别有效的。
字典中的 setdefault 函数
(2)
在我们看到的setdefault字典方法也可以作为一个独立的语句使用:
1. avs = {}
2. for (portfolio, equity, position) in data:
3. navs.setdefault(portfolio, 0)
4. navs[portfolio] += position * prices[equity]