Mat*_*ick 9 python syntax list-comprehension
我用这段代码提交了拉取请求:
my_sum = sum([x for x in range(10)])
Run Code Online (Sandbox Code Playgroud)
其中一位评论家建议:
my_sum = sum(x for x in range(10))
Run Code Online (Sandbox Code Playgroud)
(不同之处在于缺少方括号).
我很惊讶第二种形式似乎是相同的.但是当我尝试在第一个工作的其他环境中使用它时,它会失败:
y = x for x in range(10)
^ SyntaxError !!!
Run Code Online (Sandbox Code Playgroud)
两种形式是否相同?为什么在功能中不需要方括号是否有任何重要原因?或者这只是我必须知道的事情?
men*_*nsi 19
这是一个生成器表达式.要使它在独立的情况下工作,请使用大括号:
y = (x for x in range(10))
Run Code Online (Sandbox Code Playgroud)
而y成为一个发电机.您可以迭代生成器,因此它适用于需要迭代的地方,例如sum函数.
用法示例和陷阱:
>>> y = (x for x in range(10))
>>> y
<generator object <genexpr> at 0x0000000001E15A20>
>>> sum(y)
45
Run Code Online (Sandbox Code Playgroud)
保持发电机周围时要小心,你只能经历一次.因此,在上述之后,如果您sum再次尝试使用,则会发生这种情况:
>>> sum(y)
0
Run Code Online (Sandbox Code Playgroud)
因此,如果您通过一个生成器实际上是一个列表或一组或类似的东西,你必须要小心.如果函数或类存储参数并尝试多次迭代它,则会遇到问题.例如,考虑一下:
def foo(numbers):
s = sum(numbers)
p = reduce(lambda x,y: x*y, numbers, 1)
print "The sum is:", s, "and the product:", p
Run Code Online (Sandbox Code Playgroud)
如果你把它交给发电机,它将会失败:
>>> foo(x for x in range(1, 10))
The sum is: 45 and the product: 1
Run Code Online (Sandbox Code Playgroud)
您可以轻松地从生成器生成的值中获取列表:
>>> y = (x for x in range(10))
>>> list(y)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
您可以使用它来修复上一个示例:
>>> foo(list(x for x in range(1, 10)))
The sum is: 45 and the product: 362880
Run Code Online (Sandbox Code Playgroud)
但请记住,如果从生成器构建列表,则需要存储每个值.在您拥有大量项目的情况下,这可能会使用更多内存.
为什么在您的情况下使用发电机?
内存消耗要低得多的原因sum(generator expression)是sum(list):生成器版本只需存储单个值,而list-variant必须存储N个值.因此,您应该始终使用不会产生副作用的发生器.
它们并不相同。
第一种形式,
[x for x in l]
Run Code Online (Sandbox Code Playgroud)
是一个列表理解。另一个是一个生成器表达式,写成这样:
(x for x in l)
Run Code Online (Sandbox Code Playgroud)
它返回一个生成器,而不是一个列表。
如果生成器表达式是函数调用中的唯一参数,则可以跳过其括号。
| 归档时间: |
|
| 查看次数: |
2144 次 |
| 最近记录: |