2013-10-10 42 views
1

我學習一些Python和碰到過這樣的代碼,找出所有的素數多達N個。清除了一個素數的算法

N = 20 
nums = xrange(2, N) 

for i in xrange(2,8): 
    nums = filter(lambda x: x == i or x % i, nums) 

print nums # [2, 3, 5, 7, 11, 13, 17, 19] 

算法工作正常,只是這個x == i or部分混淆了我。

如果我只是刪除它的nums = filter(lambda x: x % i, nums)

結果輸出將是[11, 13, 17, 19]

然而

,該or聲明意味着,對於數字[2,3,4,5,6,7]的代碼行評估爲:

filter(lambda x: x == i, nums) 

,我不知道該怎麼僅此一項可產生[2, 3, 5, 7]這是最終輸出的一部分,僅僅是真實的。任何人都可以請詳細說明這一點,因爲我已經開始在這段代碼一段時間,不能讓我的頭在附近。

+0

注意,這僅產生質數高達11^2(121)。 – georg

回答

1

我認爲,如果你評估和檢查這段代碼的輸出,你會得到究竟是什麼在程序正在進行一個更好的想法:

N = 20 
nums = range(2, N) 

for i in xrange(2, 8): 
    print "NUMS:", nums 
    new_nums = [] 
    for x in nums: 
     print "CONDITION: x ({x}) == i ({i}) or x ({x}) % i({i}) == 0 ({x_mod_i})".format(x=x, i=i, x_mod_i=x % i) 
     if x == i or x % i: 
      print " => APPEND", x 
      new_nums.append(x) 
    nums = new_nums 
    print "***********" 

print nums # [2, 3, 5, 7, 11, 13, 17, 19] 
+0

這正是我需要說服自己。謝謝! – nutship

2

這是一個簡單的素數篩的實現。如果x == ix % ilambda x: x == i or x % i表達式評估爲Truex % i中的%是模數算子,所以如果x可被i整除,則x % i爲0,其在表達式的上下文中評估爲False