2014-03-31 139 views
2

我想了解python如何減少內置方法的工作原理,所以嘗試了一些我能想到的簡單示例。但這裏有一個我不太明白的例子,如果有人能給我一些提示,我會非常感激。Python減少功能困惑

所以我有哪幾種素數這樣

>>> arr 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199] 

一個數組,我嘗試使用減少這樣

>>> reduce(lambda x, y: is_prime(x) and is_prime(y), arr) 
False 

功能我不明白爲什麼這裏的答案是False而不是True,因爲我只是在is_prime的所有答案中,數組中的所有數字都是素數,對於每個is_prime都會返回True。

我還檢查了陣列中的每個數字實際上我is_prime()

>>> for n in arr: 
...  if not is_prime(n): 
...   print n 
... 
>>> 

我必須在這裏失去了一些東西,任何人都可以幫助返回True?謝謝。

回答

3

想想你逐個減少的值:

>>> reduce(lambda x,y: isprime(x) and isprime(y), [2]) 
2 

只有一個元素,所以reduce給了我們第一個。

>>> reduce(lambda x,y: isprime(x) and isprime(y), [2, 3]) 
True 

有道理:兩者都是素數。

>>> reduce(lambda x,y: isprime(x) and isprime(y), [2, 3, 5]) 
False 

這一個似乎不可思議,但它是因爲你實際調用

isprime(True) and isprime(5) 

因爲True是最後一個值,並Trueint值的1:

>>> int(True) 
1 

reduce!= all

0

在lambda第一個參數(x)是累計值和第二(y)是迭代值。嘗試:

reduce(lambda x, y: x and is_prime(y), arr, True) 

所以x將通過累積值由(初始累計值),所以True和is_prime(2)= TRUE開始進行更換,所以真正的被傳遞到下一個迭代.. ..

進行實驗檢查,如果一切都是奇數:

>>> arr = [3, 5, 7, 11, 15] 
>>> reduce(lambda x, y: x and y%2!=0, arr, True) 
True 

現在我將定義一個函數來打印中間累計值:

>>> def xxx(y): 
... print y 
... return y 
... 
>>> reduce(lambda x, y: xxx(x) and y%2!=0, arr, True) 
True 
True 
True 
True 
True 
True 
>>> arr = [3, 5, 7, 12, 15] 
>>> reduce(lambda x, y: xxx(x) and y%2!=0, arr, True) 
True 
True 
True 
True 
False 
False 
>>> 

這將是更清楚命名的變量是這樣的:

reduce(lambda accumulated, number: accumulated and is_prime(number), arr, True) 
1

is_prime(x) and is_prime(y) 

其結果將是一個布爾值,和當前的表達的結果將被饋送到拉姆達函數的x在下一次迭代中。

因此,如果任何is_prime調用返回False,整個結果將變爲False。由於

第一次迭代:

(Default Value & First Value) 

第二次迭代開始:

(Previous Result & Current Value) 

由於它是一個系列的操作,如果他們中任何一個False,整個表達式將被評估爲False

+0

但他們都不是'FALSE'。 –

+0

@SukritKalra但是,他甚至沒有提供'is_prime'的定義。我們如何確認? – thefourtheye

+0

'is_prime(True)== False'。 – x3al

0

傳遞給reduce()的雙參數函數應該返回一個與輸入類型相同的值,將兩個值「減少」爲一個值;減少()小心重複應用函數,減少整個輸入可迭代爲單個值。

經典示例:使用lambda x,y:x+y的輸入總和。

如果你想要得到的結果是真,如果列表中的每個數字是素數,則可以使用內置的所有()函數:

they_are_all_primes=all((is_prime(x) for x in [2,3,5]))