Python:如何将生成器函数添加到列表?

1 投票
1 回答
710 浏览
提问于 2025-04-18 07:08

你好,谢谢你关注我的问题!我最近接触到了生成器,并且阅读了关于“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 中。

撰写回答