Python 将生成器对象转换为列表

Python 将生成器对象转换为列表,python,generator,Python,Generator,我正试图用python来理解generator和yield。我知道一个函数有一个yield返回一个generator对象。但是,如果我尝试将生成器对象转换为列表,它将挂起我的机器。我正试图弄明白这是为什么。还有什么更优雅的方法可以将生成器对象转换为列表 def fib(): a, b = 0, 1 while True: yield a a, b = b, a + b a = fib() print(type(a)) b = fib() pri

我正试图用python来理解
generator
yield
。我知道一个函数有一个yield返回一个generator对象。但是,如果我尝试将生成器对象转换为列表,它将挂起我的机器。我正试图弄明白这是为什么。还有什么更优雅的方法可以将生成器对象转换为列表

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

a = fib()
print(type(a))

b = fib()
print(type(b))

print(list(b))
输出

<class 'generator'>
<class 'generator'>

问题在于生成器没有终止条件(
为True
且无
中断

即使编写这样一个生成器(例如:产生
Pi
的所有小数或我刚刚在代码中识别的斐波那契序列:)是有意义的,但当您将其转换为列表时,它将永远循环(并消耗所有内存)


顺便说一句:
list()
当然是将(有限:)生成器转换为
list
对象的最佳方法。

问题在于生成器没有结束条件(
while True
和no
break

即使编写这样一个生成器(例如:产生
Pi
的所有小数或我刚刚在代码中识别的斐波那契序列:)是有意义的,但当您将其转换为列表时,它将永远循环(并消耗所有内存)


顺便说一句:
list()
当然是将(有限:)生成器转换为
list
对象的最佳方法。

问题在于生成器-
list(fib())
基本上经过生成器的所有迭代,并将它们放在列表中。由于生成器是一个无限循环,因此迭代从未停止。

问题在于生成器-
列表(fib())
基本上会遍历生成器的所有迭代,并将它们放在列表中。由于生成器是一个无限循环,因此迭代从未停止。

list()
无法转换无限序列。您需要为生成器添加一个上限:

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

print list(fib(10))
list()
无法转换无限序列。您需要为生成器添加一个上限:

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

print list(fib(10))

由于生成器没有上限,因此要求列出它就像要求列出斐波那契序列的所有数字一样(正如前面所指出的,斐波那契序列是无限的,因此可能需要一些时间:)

因此,也可以像另一篇文章中所解释的那样,在fib()生成器中添加一个参数,或者对下一个10个值使用类似的参数:

b = fib()
[next(b) for _ in range(10)]

由于生成器没有上限,因此要求列出它就像要求列出斐波那契序列的所有数字一样(正如前面所指出的,斐波那契序列是无限的,因此可能需要一些时间:)

因此,也可以像另一篇文章中所解释的那样,在fib()生成器中添加一个参数,或者对下一个10个值使用类似的参数:

b = fib()
[next(b) for _ in range(10)]

正如其他人所说,您的发电机将无限运行。如果您试图将无限生成器转换为列表,它将运行大量内存。获取当前输出的原因是,您需要使用
next()
(在Python 2中是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>)从生成器获取下一个元素。例如

>>> def gen():
    for i in range(100):
        yield i


>>> g = gen()
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> 
但您似乎想从生成器创建一个完整的iterable,在这种情况下,您不能。Python将耗尽内存。如果要将生成器转换为列表,它必须有一个上限

>>> def gen():
    while True:
        yield 0


>>> g = gen()
>>> list(g)
# it gets stuck forever 

正如其他人所说,您的发电机将无限运行。如果您试图将无限生成器转换为列表,它将运行大量内存。获取当前输出的原因是,您需要使用
next()
(在Python 2中是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>)从生成器获取下一个元素。例如

>>> def gen():
    for i in range(100):
        yield i


>>> g = gen()
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> 
但您似乎想从生成器创建一个完整的iterable,在这种情况下,您不能。Python将耗尽内存。如果要将生成器转换为列表,它必须有一个上限

>>> def gen():
    while True:
        yield 0


>>> g = gen()
>>> list(g)
# it gets stuck forever 

我还没有在for循环中遇到
\uu
。这是什么意思?@liv2hak它基本上意味着你不需要这个变量,你只需要重复n次,n是提供给
range()的数字。
@liv2hak
只是按惯例那样使用,但它和任何其他变量名
x
i
,一样,
banana
…我还没有在for循环中遇到
。这是什么意思?@liv2hak它基本上意味着你不需要这个变量,你只需要重复n次,n是提供给
range()的数字。
@liv2hak
只是按惯例那样使用,但它和任何其他变量名
x
i
,一样,
banana
…这意味着生成器实现了与迭代器一样的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你it@liv2hak所有生成器都应该是一种定义迭代器的方便方法。这意味着生成器实现了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你it@liv2hak所有生成器都被认为是定义迭代器的方便方法。