我有这个纤维发生器。我正在尝试使用生成器表达式创建第二个
def FibIter():
yield 0
yield 1
x = 0
y = 1
while True:
result = x + y
x, y = y, result
yield result
fibiter = FibIter()
fibiter_in_range = (x for i, x in enumerate(fibiter) if 100000 < i <= 100020)
现在,如果我运行下面的代码,什么都不会发生
print(list(fibiter_in_range))
如果我运行下面的代码,数字就会被打印出来,但是for
循环不会结束
for x in fibiter_in_range:
print(x)
我想我可以遍历fibiter_in_range
,直到所有元素都被使用
关于发电机,我不了解什么?如何优雅地创建n范围为100000-100020的斐波那契数迭代器
Python不够聪明,无法知道
if 100000 < i <= 100020
将导致新生成器在100020
之后停止生成。据它所知,以后可能会有一些元素满足条件,因此它需要不断地拉动,以查看最终是否满足条件您可以使用^{} 和^{} 来筛选:
不过,这是基于数字的值进行过滤的,而不是根据它们在生成器中的索引进行过滤,因为您曾写道,您希望“使用n在100000-100020范围内的fibonacci数字优雅地创建迭代器?”。为了这个例子,我增加了上限,因为它没有找到其他元素
问题是生成器永远不会结束,并且生成器表达式不断从中获取输出,即使在
i
达到其上限之后也是如此一种简单的方法是使用itertools.islice:
相关问题 更多 >
编程相关推荐