2016-10-13 2 views
0
def _odd_iter(): 
    n = 1 
    while True: 
     n = n + 2 
     yield n 

def filt(n): 
    return lambda x: x % n > 0 

def primes(): 
    yield 2 
    it = _odd_iter() 
    while True: 
     n = next(it) 
     yield n 
     it = filter(filt(n),it) 

:【3,5,7,9,11,13,15 ......】
私はこの配列から番号7を取らなければならない場合、私はそれが素数であるかどうかを判断したいです決定するために3と5に分割されなければならない数そしてこれらの情報の3,5は不活性な負荷またはより多くの情報が将来記憶されるとしても実際の実験のより遅い計算であるが記憶されなければならない実際のプライムスピードはそれほど低くなく、メモリは爆発せず、私は内部の原則を知りたがっていますなぜPythonフィルタは無限のシーケンスを処理するときにオーバーフローしませんか?例えば

+0

Pythonのコードを投稿するとき、あなたが正確にあなたのインデントをコピーしていることを確認します。間違ってインデントされた(または完全にインデントされていない)Pythonコードはナンセンスです。 – khelwood

+0

thx、あなたの答えは –

答えて

1

あなたの投稿がタグ付けされているので、filterは遅れて評価されたジェネレータタイプのオブジェクトです。例えば、filterオブジェクトの全体を評価しようとした場合it = list(filter(filt(n),it))、あなたは悪い時を過すでしょう。 Python 2でコードを実行した場合は、filter()が自動的にリストを返します。

あなたはforループのように、完全に受け入れられる方法でそれを使用することができますので、無限の反復可能な上、フィルタは、しかし、本質的には問題ありません:

it = filter(filt(n),it) 
for iteration in it: 
    if input(): 
     print(iteration) 
    else: 
     break 
+0

thxに変更されました –

関連する問題