擅长:python、mysql、java
<p>Python不够聪明,无法知道<code>if 100000 < i <= 100020</code>将导致新生成器在<code>100020</code>之后停止生成。据它所知,以后可能会有一些元素满足条件,因此它需要不断地拉动,以查看最终是否满足条件</p>
<p>您可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.dropwhile" rel="nofollow noreferrer">^{<cd3>}</a>和<a href="https://docs.python.org/3/library/itertools.html#itertools.takewhile" rel="nofollow noreferrer">^{<cd4>}</a>来筛选:</p>
<pre><code>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]
</code></pre>
<p>不过,这是基于数字的值进行过滤的,而不是根据它们在生成器中的索引进行过滤,因为您曾写道,您希望“使用n在100000-100020范围内的fibonacci数字优雅地创建迭代器?”。为了这个例子,我增加了上限,因为它没有找到其他元素</p>