📜  Python中的any()和all()

📅  最后修改于: 2020-08-20 10:34:47             🧑  作者: Mango

介绍any()和all()

在本教程中,我们将介绍Python中的any()all()函数。

any(iterable)all(iterable)是内置的Python功能和已经出现自Python 2.5的发布。这两个函数等效于在传递的每个元素之间编写一系列orand运算符iterable。它们都是便利功能,它们通过替换样板循环来缩短代码。

两种方法都会短路并尽快返回一个值,因此即使使用巨大的可迭代对象,它们也将尽可能高效。

and和or运算符

让我们提醒自己andor运算符的工作原理,因为这些函数基于它们。

或运算子

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运算符

只有在所有条件均满足的情况下,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()

该方法的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()函数的更多信息,我们将为您服务!

any()

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()函数

当使用任何逻辑运算符时(因此也使用any()和时),造成混乱和错误的常见原因all()是元素不是boolean数据类型时发生的情况。换句话说,当它们不完全TrueFalse,而是必须被评估为True或时False

某些编程语言不会将非boolean数据类型评估为booleans。例如,如果您尝试使用if("some string")或进行某些操作,if(15)并且告诉您所使用的类型无法转换为,Java会抱怨boolean

另一方面,Python则没有这种作用,而是将转换传递给的内容boolean而不会警告您。

Python将大多数内容转换为True以下几种例外:

  • 等于0(包括0.0)的任何数值都被视为False。这里常见的误解是负值(-2,-3.3,…)也被视为False而不被视为False
  • 任何空序列(或集合)都被视为False,包括Empty string,Empty list等。请记住,all()与Empty一起使用时可能会发生意外行为iterable(它将返回True)。
  • 当然,实际boolean值和特殊值也一样。FalseFalseNone

一些示例说明如何使用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()函数,并通过几个示例展示了它们的用法。