Python求和风格问题

时间:2011-04-16 00:00:06

标签: coding-style python

哪个更pythonic?

    T = 0
    for a in G:
        T += a.f()

    T = sum(a.f() for a in G)

4 个答案:

答案 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