got*_*nes 127
你了解列表理解吗?如果是这样,生成器表达式就像列表推导,但不是找到您感兴趣的所有项目并将它们打包到列表中,而是等待,并逐个从表达式中生成每个项目.
python2版本:
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print filtered_list
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print filtered_gen # notice it's a generator object
<generator object at 0xb7d5e02c>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> filtered_gen.next()
5
>>> filtered_gen.next()
9
>>> filtered_gen.next()
6
>>> filtered_gen.next() # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print gen_to_list
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
Run Code Online (Sandbox Code Playgroud)
python3版本:
改变next()以__next__()
因为生成器表达式一次只需要生成一个项目,所以可以大大节省内存使用量.在需要一次取一个项目,根据该项目进行大量计算,然后转到下一个项目的情况下,生成器表达式最有意义.如果您需要多个值,您还可以使用生成器表达式并一次抓取一些.如果在程序进行之前需要所有值,请改用列表推导.
列表/生成器推导式是一种构造,您可以使用它从现有列表/生成器创建新的列表/生成器。
假设您要生成从 1 到 10 的每个数字的平方列表。您可以在 Python 中执行此操作:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Run Code Online (Sandbox Code Playgroud)
在这里,range(1,11)生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],但该range函数不是 Python 3.0 之前的生成器,因此我使用的构造是列表推导式。
如果我想创建一个做同样事情的生成器,我可以这样做:
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
Run Code Online (Sandbox Code Playgroud)
然而,在 Python 3 中,它range是一个生成器,因此结果仅取决于您使用的语法(方括号或圆括号)。
生成器理解是创建具有特定结构的生成器的一种简单方法。假设您想要一个一个一个generator地输出your_list. 如果您使用函数样式创建它,它将是这样的:
def allEvens( L ):
for number in L:
if number % 2 is 0:
yield number
evens = allEvens( yourList )
Run Code Online (Sandbox Code Playgroud)
您可以使用此生成器理解表达式获得相同的结果:
evens = ( number for number in your_list if number % 2 == 0 )
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,当你打电话时,你next(evens)会得到下一个偶数your_list。
| 归档时间: |
|
| 查看次数: |
52184 次 |
| 最近记录: |