斐波那契发生器迭代器和无限发生器

2024-09-30 00:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个纤维发生器。我正在尝试使用生成器表达式创建第二个

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的斐波那契数迭代器


Tags: 代码intruefor表达式defrangeresult
2条回答

Python不够聪明,无法知道if 100000 < i <= 100020将导致新生成器在100020之后停止生成。据它所知,以后可能会有一些元素满足条件,因此它需要不断地拉动,以查看最终是否满足条件

您可以使用^{}^{}来筛选:

from itertools import takewhile, dropwhile

...


fibiter = FibIter()
fibiter_in_range = takewhile(lambda n: n <= 10002000,
                             dropwhile(lambda n: n < 100000, fibiter))

>>> list(fibiter_in_range)
[121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465]

不过,这是基于数字的值进行过滤的,而不是根据它们在生成器中的索引进行过滤,因为您曾写道,您希望“使用n在100000-100020范围内的fibonacci数字优雅地创建迭代器?”。为了这个例子,我增加了上限,因为它没有找到其他元素

问题是生成器永远不会结束,并且生成器表达式不断从中获取输出,即使在i达到其上限之后也是如此

一种简单的方法是使用itertools.islice

from itertools import islice

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 = islice(fibiter, 10, 15)
print(list(fibiter_in_range))
# [55, 89, 144, 233, 377]

相关问题 更多 >

    热门问题