【问题标题】:Prime generator in pythonpython中的Prime生成器
【发布时间】:2016-03-05 12:41:07
【问题描述】:

我正在编写一个与此链接中的任何人都不同的素数生成器

generator in Python generating prime numbers

这是我的代码

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

当我运行类似的东西时

for i in prime_generator(50):
    print(i)

它从来不会像我那样倾倒 15、33 之类的东西。总之,它给了我 2 和所有奇数。这里出了什么问题?

【问题讨论】:

  • 嗯,15 不是素数。也不是 33 岁。
  • 另一方面,所有奇数都会出现。 有趣

标签: python python-3.x


【解决方案1】:

问题是 lambda 中的 i 不是“固定的”;当i 在外部范围内发生变化时,先前创建的 lambda 函数都使用新值,因此它们都进行相同的检查:查看来自sequence() 的当前值是否可以被最后找到的素数整除。他们从来都不是。

将其包装到另一个 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,但这可以很容易地修复。

【讨论】:

  • 您可以使用默认参数,而不是将其包装在另一个 lambda 中:it = filter(lambda x, i=i: x % i, it)
  • 当然,但我更喜欢默认的 arg 方法而不是使用闭包,因为它更紧凑、更扁平,而且在我的测试中它往往运行得更快。
  • 默认参数解决方案的好处是它成为函数中的局部变量(我认为),并且它们具有超快的查找速度,所以这肯定会有所帮助。但是我觉得有一个永远不会用作真正参数的默认参数有点不对劲,而且它只是一个爱好问题的堆栈溢出答案,所以我会坚持对我来说看起来最干净的东西:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2010-11-01
  • 2018-02-11
  • 2023-03-29
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多