rob*_*ing 5 python primes generator
以下代码用于生成质数pythonic?
def get_primes(n):
primes=[False,False]+[True]*(n-1)
next_p=(i for i,j in enumerate(primes) if j)
while True:
p=next(next_p)
yield p
primes[p*p::p]=[False]*((n-p*p)//p+1)
Run Code Online (Sandbox Code Playgroud)
请注意,next(next_p)最终将抛出StopIteration错误,该错误以某种方式结束函数get_primes.那不好吗?
另请注意,next_p是一个迭代质数的生成器,但是在迭代期间质数会发生变化.这是不好的风格?
对于前一百万个素数,添加以下if语句使其低于0.25秒:
if p*p<=n:
primes[p*p::p]=[False]*((n-p*p)//p+1)
Run Code Online (Sandbox Code Playgroud)
next(next_p)抛出错误并不坏StopIteration——这就是生成器在项目用完时总是做的事情!
在迭代列表时更改列表的长度是一个坏主意。但仅仅改变内容并没有什么问题。总的来说,我认为这是一个相当优雅的(即使是基本的)seive。
一个小观察:当你“划掉”素数的倍数时,如果你稍微思考一下,你会发现你不必从 开始p * 2。您可以跳至p ** 2。
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |