哪个更pythonic?
T = 0
for a in G:
T += a.f()
或
T = sum(a.f() for a in G)
答案 0 :(得分:8)
后者。该名称仅绑定一次,而不是发生n + 1次。
答案 1 :(得分:6)
后者。它只是一行,你很快就会看到它在做什么。除此之外,只有一个访问T
可能会更快一点。
答案 2 :(得分:2)
答案 3 :(得分:1)
为了澄清我对Ignacio关于增强赋值的答案的评论总是重新绑定名称,即使对于可变对象,我提供以下示例:
class Broken(list):
def __iadd__(self, other):
list.__iadd__(self, other) # This is not quite right
a = b = Broken()
a += [123]
print(b) # OK
print(a) # What!?
正如我在评论中所说,增强赋值实际上扩展为可变对象的等效a = a.__iadd__([123])
。证明这一点的另一种经典方法是使用元组:
>>> t = [],
>>> t[0] += [123]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t[0]
[123]
上面Broken
示例中的错误是不从__iadd__
方法返回值。它应该以{{1}}结束,或者只是将调用的结果返回到父类方法。
return self