Python reduce函数混乱
我试图理解python reduce内置方法是如何工作的,所以尝试了一些我能想到的简单示例。但这里有一个我不太明白的例子,如果有人能给我一些提示,我将非常感激 我有一个数组,它有几个像这样的素数Python reduce函数混乱,python,primes,reduce,Python,Primes,Reduce,我试图理解python reduce内置方法是如何工作的,所以尝试了一些我能想到的简单示例。但这里有一个我不太明白的例子,如果有人能给我一些提示,我将非常感激 我有一个数组,它有几个像这样的素数 >>> 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
>>> 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
我试着像这样使用reduce函数
>>> 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
我不太明白为什么这里的答案是假的而不是真的,因为我只是对所有的is_素数的答案和数组中的所有数字都是素数求和,这将为每个is_素数返回真
我还检查了数组中的每个数字对于我的is_prime()是否都返回True
我一定是遗漏了什么,有人能帮忙吗?谢谢。lambda中的第一个参数(x)是累积值,第二个参数(y)是迭代值。尝试:
reduce(lambda x, y: x and is_prime(y), arr, True)
因此,x将被以真开始的累积值(初始累积值)替换,因此真且is_prime(2)=真,因此真将被传递到下一次迭代
正在试验检查是否全部为奇数:
>>> 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)
结果
is_prime(x) and is_prime(y)
将是布尔值,当前表达式的结果将在下一次迭代中提供给lambda函数的x
因此,如果任何调用返回False
,整个结果将变为False
。因为
第一次迭代:
(Default Value & First Value)
第二次迭代之后:
(Previous Result & Current Value)
由于它是一系列and运算,如果其中任何一个为False
,则整个表达式的计算结果将为False
请考虑要逐个减少的值:
>>> 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
是最后一个值,True
的int
值为1:
>>> int(True)
1
减少
!=all
传递给reduce()的双参数函数应该返回一个与输入类型相同的值,将两个值“还原”为一个值;reduce()注意重复应用函数,将整个输入iterable减少为单个值
经典示例:使用λx,y:x+y
的输入总和
如果希望列表中的每个数字都是素数,则结果为真,可以使用内置的all()函数:
they_are_all_primes=all((is_prime(x) for x in [2,3,5]))
但是没有一个是假的,但是,他甚至没有提供is_prime的定义。我们如何确认呢?is_prime(True)=False
@sukritkalla我读到了,但是告诉我这个答案有什么问题吗?