Python any()和all()进行规约

Python any函数和all函数进行规约,可以使用函数any()all()进行布尔归约,将一个集合的元素归约成单个值(True或者False)。all()函数确保所有值都是Trueany()函数确保至少有一个值是True

这两个函数与数理逻辑中的全称量词与存在量词密切相关,当我们要表达某个给定集合中的所有元素具备某一属性时,可以写成下面的形式:

Python any函数和all函数进行规约

这个公式读作:对于SomeSet集合中的任一元素 x ,函数Prime(x)为真。注意在逻辑表达式前面添加的量词。
使用Python,需要稍微调整逻辑表达式中各项的顺序,如下所示:

all(isprime(x) for x in SomeSet)

对每个输入参数(isprime(x))求值,最终将集合归约为单个值True或者False
any()函数与存在量词相关,当我们想确认集合中没有元素是质数时,可以使用下面任一表达式:
Python any函数和all函数进行规约

第一个公式表示:SomeSet集合中的元素不都是质数。第二个公式表示:SomeSet集合中至少有一个元素不是质数。这两种表述效果相同:如果不是所有元素都是质数,那么至少有一个元素是非质数。
略微调整一下顺序,上面公式的Python版本如下:

not all(isprime(x) for x in someset)
any(not isprime(x) for x in someset)

二者作用相同,差别在于性能和可读性。又由于二者的性能差别不大,就只能通过可读性来区分了,那么上面哪种表述方式更易读呢?
all()函数对集合中的所有元素进行and归约,效果相当于在各个值之间加上and运算符。类似地,any()函数进行or归约。第10章将继续介绍reduce()函数。这里没有最佳答案,不同的读者对可读性各有偏好。
下面看一下这些函数的退化形式,如果作为输入参数的序列的元素数量为0会怎样?all(())或者all([])的值会是什么?
如果我们问:“空集合中的元素都是质数吗?”你会怎么回答呢?作为提示,我们稍微拓展一下,看看单位元的概念。
如果我们问:“空集中所有元素都是质数,并且SomeSet集合中所有元素都是质数吗?”可以把对空集的归约和对SomeSet的归约放在一起做交集来解决这个问题。
Python any函数和all函数进行规约

使用集合的分配律处理上面的and运算符,改为两个集合做并集的形式,再测试元素是否为质数。
Python any函数和all函数进行规约

显然,SomeSet \cup \varnothing,任意集合与空集的并集是这个集合自身,所以空集是并集单位元,与0作为加法单位元是一个道理。
Python any函数和all函数进行规约

类似地,any(())一定是or单位元,即False。由于 b x 1 = b,可以把1看作乘法单位元,所以all(())一定是True
验证一下Python的行为是否符合如下规则:

>>> all(())
True
>>> any(())
False

可以用Python的一些工具处理逻辑运算,包括内置的andornot运算符,及用于集合的any()all()函数等。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程