📅  最后修改于: 2020-08-20 10:34:47             🧑  作者: Mango
在本教程中,我们将介绍Python中的any()
和all()
函数。
该any(iterable)
和all(iterable)
是内置的Python功能和已经出现自Python 2.5的发布。这两个函数等效于在传递的每个元素之间编写一系列or
和and
运算符iterable
。它们都是便利功能,它们通过替换样板循环来缩短代码。
两种方法都会短路并尽快返回一个值,因此即使使用巨大的可迭代对象,它们也将尽可能高效。
让我们提醒自己and
/ or
运算符的工作原理,因为这些函数基于它们。
的or
操作者的计算结果为True
,如果任何一个条件(操作数)是True
。
print("(2 == 2) or (3 == 3) evaluates to: " + str((2 == 2) or (3 == 3)))
print("(2 == 2) or (3 == 2) evaluates to: " + str((2 == 2) or (3 == 2)))
print("(2 == 0) or (3 == 2) evaluates to: " + str((2 == 0) or (3 == 2)))
输出:
(2 == 2) or (3 == 3) evaluates to: True
(2 == 2) or (3 == 2) evaluates to: True
(2 == 0) or (3 == 2) evaluates to: False
我们可以or
在单个语句中链接多个,它将再次评估True
是否有以下条件True
:
print(str(False or False or False or True or False))
结果是:
True
只有在所有条件均满足的情况下,and
运营商True
才会进行评估True
:
print("(2 == 2) and (3 == 3) evaluates to: " + str((2 == 2) and (3 == 3)))
print("(2 == 2) and (3 == 2) evaluates to: " + str((2 == 2) and (3 == 2)))
print("(2 == 0) and (3 == 2) evaluates to: " + str((2 == 0) and (3 == 2)))
输出:
(2 == 2) and (3 == 3) evaluates to: True
(2 == 2) and (3 == 2) evaluates to: False
(2 == 0) and (3 == 2) evaluates to: False
与相似or
,我们可以链接多个and
运算符,并且True
仅当所有操作数的求和结果为True
:
print(str(True and True and True and False and True))
结果是:
False
该方法的any(iterable)
行为就像我们传递的or
每个元素之间的一系列运算符一样iterable
。它用于替换类似于此循环的循环:
for element in some_iterable:
if element:
return True
return False
我们只需调用any(some_iterable)
以下命令即可得到相同的结果:
print(any([2 == 2, 3 == 2]))
print(any([True, False, False]))
print(any([False, False]))
运行这段代码将导致:
True
True
False
注意:any()
与布尔值以外的字典和数据类型一起使用时,可能会发生意外行为。如果any()
与字典一起使用,它将检查是否有任何键的计算结果为True
,而不是值:
dict = {True : False, False: False}
print(any(dict))
输出:
True
而如果any()
检查这些值,则输出应为False
。
该方法any()通常与map()方法和列表理解结合使用:
old_list = [2, 1, 3, 8, 10, 11, 13]
list_if_even = list(map(lambda x: x % 2 == 0, old_list))
list_if_odd = [x % 2 != 0 for x in old_list]
print(list_if_even)
print(list_if_odd)
print("Are any of the elements even? " + str(any(list_if_even)))
print("Are any of the elements odd? " + str(any(list_if_odd)))
输出:
[True, False, False, True, True, False, False]
[False, True, True, False, False, True, True]
Are any of the elements even? True
Are any of the elements odd? True
注意:如果将空iterable
值传递给any()
,则该方法返回False
。
如果您想了解有关map(),filter()和reduce()函数的更多信息,我们将为您服务!
该all(iterable)
方法的评估就像我们传递的and
每个元素之间的一系列运算符一样iterable
。它用于替换类似于此循环的循环:
for element in iterable:
if not element:
return False
return True
True
仅当中的每个元素的iterable
计算结果均为时True
,该方法才返回;False
否则:
print(all([2 == 2, 3 == 2]))
print(all([2 > 1, 3 != 4]))
print(all([True, False, False]))
print(all([False, False]))
输出:
False
True
False
False
注意:与any()
传递一样,传递除以外的字典和数据类型时,可能会发生意外行为boolean
。同样,如果all()
将其与字典一起使用,它将检查所有键是否为True
,而不是value为。
与的另一个相似之处any()
是,all()
通常也与map()
功能和列表理解结合使用:
old_list = ["just", "Some", "text", "As", "An", "example"]
list_begins_upper = list(map(lambda x: x[0].isupper(), old_list))
list_shorter_than_8 = [len(x) < 8 for x in old_list]
print(list_begins_upper)
print(list_shorter_than_8)
print("Do all the strings begin with an uppercase letter? " + str(all(list_begins_upper)))
print("Are all the strings shorter than 8? " + str(all(list_shorter_than_8)))
输出:
[False, True, False, True, True, False]
[True, True, True, True, True, True]
Do all the strings begin with an uppercase letter? False
Are all strings shorter than 8? True
注意:如果将空iterable
值传递给all()
,则该方法返回True
!这是因为用于all()
检查的代码是否包含中的任何False
元素,如果iterable
列表为空,则没有元素,因此也没有False
元素。
当使用任何逻辑运算符时(因此也使用any()
和时),造成混乱和错误的常见原因all()
是元素不是boolean
数据类型时发生的情况。换句话说,当它们不完全True
是False
,而是必须被评估为True
或时False
。
某些编程语言不会将非boolean
数据类型评估为boolean
s。例如,如果您尝试使用if("some string")
或进行某些操作,if(15)
并且告诉您所使用的类型无法转换为,Java会抱怨boolean
。
另一方面,Python则没有这种作用,而是将转换传递给的内容boolean
而不会警告您。
Python将大多数内容转换为True
以下几种例外:
False
。这里常见的误解是负值(-2,-3.3,…)也被视为False
,而不被视为False
!False
,包括Empty string
,Empty list
等。请记住,all()
与Empty一起使用时可能会发生意外行为iterable
(它将返回True
)。boolean
值和特殊值也一样。False
False
None
一些示例说明如何使用Python通过any()
和将布尔值“布尔化”其他数据类型的方式all()
。
list_of_strings = ["yet", "another", "example",""]
print("Do all strings have some content?", all(list_of_strings))
list_of_ints = [0, 0.0, -2, -5]
print("Are any of the ints different than 0?", any(list_of_ints))
输出:
Do all strings have some content? False
Are any of the ints different than 0? True
请记住,您可能仍想通过不使用boolean
像这样的隐式转换来编写更具可读性的代码。
无论是any()
和all()
功能在那里为方便起见,当他们使代码更短,但保持可读性只应使用。
在本文中,我们跳入any()
和all()
函数,并通过几个示例展示了它们的用法。