Python any函数和all函数进行规约,可以使用函数any()
和all()
进行布尔归约,将一个集合的元素归约成单个值(True
或者False
)。all()
函数确保所有值都是True
,any()
函数确保至少有一个值是True
。
这两个函数与数理逻辑中的全称量词与存在量词密切相关,当我们要表达某个给定集合中的所有元素具备某一属性时,可以写成下面的形式:
这个公式读作:对于SomeSet
集合中的任一元素 x ,函数Prime(x)
为真。注意在逻辑表达式前面添加的量词。
使用Python,需要稍微调整逻辑表达式中各项的顺序,如下所示:
all(isprime(x) for x in SomeSet)
对每个输入参数(isprime(x)
)求值,最终将集合归约为单个值True
或者False
。
any()
函数与存在量词相关,当我们想确认集合中没有元素是质数时,可以使用下面任一表达式:
第一个公式表示: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
的归约放在一起做交集来解决这个问题。
使用集合的分配律处理上面的and
运算符,改为两个集合做并集的形式,再测试元素是否为质数。
显然,SomeSet \cup \varnothing,任意集合与空集的并集是这个集合自身,所以空集是并集单位元,与0作为加法单位元是一个道理。
类似地,any(())
一定是or
单位元,即False
。由于 b x 1 = b,可以把1看作乘法单位元,所以all(())
一定是True
。
验证一下Python的行为是否符合如下规则:
>>> all(())
True
>>> any(())
False
可以用Python的一些工具处理逻辑运算,包括内置的and
、or
、not
运算符,及用于集合的any()
、all()
函数等。