Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的素数生成器_Python_Python 3.x - Fatal编程技术网

python中的素数生成器

python中的素数生成器,python,python-3.x,Python,Python 3.x,我正在写一个素数生成器,它不同于此链接中的任何人 这是我的密码 def sequence(): i = 1 while True: i += 2 yield i def prime_generator(n): i = 2 it = sequence() while i < n: it= filter(lambda x: x % i, it) i = next(it) y

我正在写一个素数生成器,它不同于此链接中的任何人

这是我的密码

def sequence():
    i = 1 
    while True:
        i += 2
        yield i

def prime_generator(n):
    i = 2
   it = sequence()
    while i < n:
        it= filter(lambda x: x % i, it)
        i = next(it)
        yield i
对我来说,它从来没有甩过15、33之类的东西。总之,它给了我2个和所有的奇数。这里出了什么问题?

问题是lambda中的i没有被修复;当我在外部范围内更改时,以前创建的lambda函数都使用新值,因此它们都执行相同的检查:查看序列中的当前值是否可被最后找到的素数整除。他们从来都不是

将其包装到另一个lambda中,然后调用它,以便可以固定i的值:

def prime_generator(n):
    i = 2
    it = sequence()
    while i < n:
        it = (lambda i: filter(lambda x: x % i, it))(i)
        i = next(it)
        yield i

编辑:我也不相信你的代码,也不相信这会产生2,但这可以很容易地修复。

嗯,15不是素数。两者都不是33。另一方面,所有奇数都会出现。有趣。与其将其包装在另一个lambda中,不如使用默认参数:it=filterlambda x,i=i:x%i,itSure,但我更喜欢默认的arg方法,而不是使用闭包,因为它更紧凑,更平坦,在我的测试中,它的运行速度会快一点。默认参数解决方案的好处是,它在我认为的函数中变成了一个局部变量,并且它们有超快速的查找,所以这肯定会有帮助。但我觉得有一个默认参数是有点错误的,它永远不会被用作真正的参数,它只是一个业余爱好问题的堆栈溢出答案,所以我会坚持我认为最干净的:-
def prime_generator(n):
    i = 2
    it = sequence()
    while i < n:
        it = (lambda i: filter(lambda x: x % i, it))(i)
        i = next(it)
        yield i