Python:如何将生成器函数添加到列表?
你好,谢谢你关注我的问题!我最近接触到了生成器,并且阅读了关于“Python中的yield关键字”的内容。根据我的理解,yield是即时生成的,不能被索引,并且在执行yield命令后,它会记住上次停止的位置(如果我说错了请纠正我,我还是新手)。
我的问题是,为什么:
from itertools import combinations
x = [['4A'],['5A','5B','5C'],['7A','7B']]
y = list()
for combination in x:
for i in range(1,len(combination)+1):
y.append(list(combinations(combination,i)))
print y # [[('4A',)], [('5A',), ('5B',), ('5C',)],
# [('5A', '5B'), ('5A', '5C'), ('5B', '5C')],
# [('5A', '5B', '5C')], [('7A',), ('7B',)], [('7A', '7B')]]
但这个不行:
from itertools import combinations
x = [['4A'],['5A','5B','5C'],['7A','7B']]
y = list()
for combination in x:
for i in range(1,len(combination)+1):
y.append((combinations(combination,i)))
print y
因为我在yield之后直接把组合添加到y中,为什么当我以列表的形式添加时可以,但正常添加时却不行呢?
1 个回答
3
当你调用 list(generator_function())
时,generator_function
会被完全执行,所有的元素都会被存储到一个列表里。所以,这三种操作实际上是在做同样的事情:
l = list(generator_function())
...
l = [x for x in generator_function()]
...
l = []
for x in generator_function():
l.append(x)
在你的例子中,如果不使用 list(..)
,你只是把 combinations
这个生成器对象添加到了 y
里。而使用 list(...)
的话,你是在遍历 combinations
这个生成器,把它的所有内容放到一个 list
对象里,然后再把这个列表添加到 y
中。