Python一行代码实现质数生成器

6
我将尝试用一行Python代码生成质数,仅作为有趣的练习。 以下代码的功能正常,但速度太慢:
primes = lambda q: (i for i in xrange(1,q) if i not in [j*k for j in xrange(1,i) for k in xrange(1,i)])
for i in primes(10):
   print i,

所以我尝试只检查j和k的平方根:
primes = lambda q: (i for i in xrange(1,q) if i not in [j*k for j in xrange(1,int(round(math.sqrt(i)+1))) for k in xrange(1,int(round(math.sqrt(i)+1)))])
for i in primes(10):
   print i,

但是它输出的是:2 3 5 6 7 8

因此,我的索引 j 和 k 必须有问题,但我一点头绪也没有。


如果您可以接受非单行代码,这里有一个问题:https://dev59.com/6XRB5IYBdhLWcg3wn4fc - Andy
可能是重复的问题:Python- 厄拉多塞筛法- 紧凑的Python - ninjagecko
2
我能够用两行代码实现它: http://stackoverflow.com/a/9302299/5987 - Mark Ransom
1
你可以利用列表推导式内部正在构建的列表,使用表达式 locals['_[1]'] 来引用它。 - APerson
这是我今天看到的第三个要求一行代码的问题。除非你是Linus Torvalds并设计Linux,否则我不理解将多个LOC塞入单行的热潮。 - Abhijit Sarkar
@AbhijitSarkar “single-line” 的意思是单表达式,我认为。 - Will Ness
12个回答

0
def isPrime(n):
    return all(n % d for d in range(2, int(n**.5)+1))

primes = {n for n in range(2, 100) if isPrime(n)}

如果需要的话,这可以压缩成一行:
primes = {n for n in range(2, 100) if all(n % d for d in range(2,int(n**.5)+1))}

{ genexp } 生成一个集合:重复的值只会被存储一次。

all() 确保没有任何一个值是 False (或者 0);在这种情况下,它确保我们测试的数字下面的所有数字都不是因子,这样该数字就是质数。

我们在范围的末尾添加 1,因为 range() 是非包含的。

为了提高效率,我们检查所有小于该数字平方根的因子:如果 sqrt(n) 下面没有因子,那么上面也没有因子,因为因子总是成对出现。

为了进一步提高效率,我们可以使用埃拉托色尼筛法(对于小的 n),首先消除所有 2 的因子,然后消除所有 3 的因子,以此类推。


-1

我的代码是(对于范围在2到50之间的数字):

import operator

[len(x) for x in list(map(lambda x: [operator.mod(len(range(1,x)), z) for z in range(1,x)], [item for item in range(2,50)])) if x.count(0) == 2]

你好,你能把你的陈述转化成一个问题吗? 你是想问如何用一行代码写出 Python 的质数生成器吗? - Yacine Mahdid
1
@YacineMahdid 这篇文章是一个答案,而不是一个问题。 - alamoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接