Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python reduce函数混乱_Python_Primes_Reduce - Fatal编程技术网

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

我试图理解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, 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我读到了,但是告诉我这个答案有什么问题吗?