繁体   English   中英

在Python中设置无限生成器的限制

[英]Setting a limit on an infinite generator in Python

我正在尝试使下面的生成器能够设置返回数字的上限。

调用list(it.takewhile(lambda x: x < 100, get_primes()))按预期返回100以下所有素数的列表但是list(get_primes(100)) (应该以相同的方式返回相同的列表)返回一个空列表。

显然,我可以在for循环中包含一个if n and candidate>=n: break但我最感兴趣的是为什么if n: return构造不能像我期望的那样工作。 它不应该只返回相同的takewhile迭代器吗? 我在这里俯瞰什么?

import itertools as it

def get_primes(n=None):
    """
    Generates primes to a max of n.

    >>> list(get_primes(100))
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
    """
    if n:
        return it.takewhile(lambda x: x < n, get_primes())
    composites = {}
    yield 2
    for candidate in it.count(3, 2):
        prime_factor = composites.pop(candidate, None)
        if prime_factor is None:
            yield candidate
            composites[candidate**2] = candidate
        else:
            composite = candidate + 2*prime_factor
            while composite in composites:
                composite += 2*prime_factor
            composites[composite] = prime_factor

这里:

return it.takewhile(lambda x: x < n, get_primes())

由于这是一个生成器,它需要yield这些值而不是return它们。 根据您的Python版本,您可以使用yield from语法。

以下内容可能有助于作为背景阅读: 在Python 3.3中将生成器与yield一起返回

问题在于线路

return it.takewhile(lambda x: x < n, get_primes())

因为它是一个生成器,返回一些东西会停止执行,并引发StopIteration()。 您需要返回生成器中的值

#return all the values from generator
for a in it.takewhile(lambda x: x < n, get_primes())
    yield a

return 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM