mkc*_*kcs 6 python generator python-3.x
我试图在Python 3.2中编写一个懒惰版的Eratosthenes Sieve.这是代码:
import itertools
def primes():
candidates = itertools.count(2)
while True:
prime = next(candidates)
candidates = (i for i in candidates if i % prime)
yield prime
Run Code Online (Sandbox Code Playgroud)
但是,当我遍历primes()时,我只能得到连续的数字.例如,
print(list(itertools.islice(primes(),0,10)))
Run Code Online (Sandbox Code Playgroud)
打印列表
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,对primes()的以下微小修改使它工作:
def primes():
candidates = itertools.count(2)
while True:
prime = next(candidates)
candidates = (i for i in candidates if i % prime)
next(itertools.tee(candidates)[1]) ########### NEW LINE
yield prime
Run Code Online (Sandbox Code Playgroud)
我猜我错过了关于发生器参数范围的一些信息
candidates = (i for i in candidates if i % prime)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何修改代码而不添加这个随机的新行.有谁知道我做错了什么?谢谢.
修复真的要替换:
candidates = (i for i in candidates if i % prime)
Run Code Online (Sandbox Code Playgroud)
有:
candidates = (lambda prime: (i for i in candidates if i % prime))(prime)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |