2014-03-31 141 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]))