gpt4 book ai didi

Python 从生成器到列表

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:39 24 4
gpt4 key购买 nike

我看过一些示例,我们可以将 generator 转换为 list,如下所示。

第一个例子:

print [2 * n for n in range(5)]
# same as the list comprehension above
print list(2 * n for n in range(5))

第二个例子:

def double(L):
for x in L:
yield x*2

# eggs will be a generator
eggs = double([1, 2, 3, 4, 5])
# the above is equivalent to ("generator comprehension"?)
eggs = (x*2 for x in [1, 2, 3, 4, 5])
# need to do this if you need a list
eggs = list(double([1, 2, 3, 4, 5]))
print eggs
# the above is equivalent to (list comprehension)
eggs = [x*2 for x in [1, 2, 3, 4, 5]]
print eggs

我的问题是,所有的generators都可以转移到list中吗?(我在下面的例子中失败了):

def get_primes(number):
while True:
if is_prime(number):
number = yield number
number += 1

def is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False

generator = get_primes(5)
print list(generator)

输出:TypeError:+= 不支持的操作数类型:'NoneType' 和 'int'

问题在这里:number = yield number 出于某种原因。对此的一些解释表示赞赏。

最佳答案

你的发电机坏了:

number = yield number

这应该只是 yield number。将 yield 表达式的值分配给变量仅在您希望调用者将值发送 到生成器时才有用。当您正常地迭代一个生成器时,它的所有 yield 表达式的计算结果都是 None。此行将 None 分配给 number,然后将 number += 1 分配给 TypeErrors,因为您正在尝试将整数添加到 None.

如果您尝试使用 for 循环遍历此生成器,您会遇到同样的错误。


也就是说,并非所有生成器都可以转换为列表,您的代码,无论是固定的还是未固定的,都是原因的一个例子:生成器可能会永远抛出异常或产生值。 list 构造函数大致等同于

def list(arg):
l = []
for item in arg:
l.append(arg)
return l

如果生成器抛出异常,异常会传播到 list 构造函数之外并终止循环。如果生成器永远 yield,循环将永远进行下去,或者至少直到您耗尽内存或耐心为止。你也可以有一个拒绝屈服的生成器:

def noyield():
while True:
pass
yield 1 # Not happening.

关于Python 从生成器到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com