2014-01-07 111 views
1

我是Python的新手和處理主要發電機。我想要使​​用的算法是Sieve of Atkinfor循環與2個迭代器和2個範圍

在這一刻,我試圖按照算法的僞代碼作爲我的練習。但是,我遇到了一個問題,我找不到任何關於它的參考。 (也許我不擅長搜索...)。在僞代碼中,for (x, y) in [1, √limit] × [1, √limit]:...讓我感到困惑。我知道它是什麼意思,但不知道如何將這段代碼翻譯成Python代碼。

對不起,如果我的問題是不恰當的,並感謝您的幫助。 :)

下面是我的代碼的一部分。

itx = iter(range(1, int(limit**0.5))) 
ity = iter(range(1, int(limit**0.5))) 
for x, y in zip(itx, ity): 
    n = 4*(x**2)+(y**2) 
    if n <= limit and (n%12 == 1 or n%12 == 5): 
     sieve[n] = not sieve[n] 

    n = 3*(x**2)+(y**2) 
    if n <= limit and n%12 == 7: 
     sieve[n] = not sieve[n] 

    n = 3*(x**2)-(y**2) 
    if x > y and n <= limit and n%12 == 11: 
     sieve[n] = not sieve[n] 

    itx.next() 
    ity.next() 

回答

4

for (x, y) in [1, √limit] × [1, √limit]應轉換爲一個產品:

for x in itx: 
    for y in ity: 

或使用itertools.product()

from itertools import product 

for x, y in product(itx, ity): 

注意,你不需要調用迭代器.next()!刪除itx.next()ity.next()行,除非您的表示跳過生成的值。 for構造爲您提供迭代器。

+0

謝謝Martijn。這對我有用。感謝您的幫助。 :) – PCHC

3

而不是zip(itx, ity),您需要使用itertools.product(itx, ity)

zip並行迭代兩個迭代器(操作稱爲convolution),產生匹配項對並在最短迭代器耗盡時結束迭代。 itertools.product迭代兩個迭代器的Cartesian product,產生來自一個和另一個集合的項目的所有組合的對。後者是運營商所指的。

正如Martijn Pieters所指出的那樣,在迭代器上手動調用.next()是不正確的,因爲for自己提高了它們,並且自己完成它,最終只處理iterable的每個第二項。此外,iter(range(...))是不必要的 - 只需使用xrange(或Python 3中的range)。