如何在Python中使用all、any、max和min函数
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
Python 包含许多 内置函数 ——这些是全局 Python 函数,可以从任何 Python 代码调用,而无需导入额外的模块。 例如,您可以随时调用 print
内置函数来输出文本。
其中的几个内置函数(all
、any
、max
和min
)取值的iterables为他们的论点并返回一个值。 iterable 是一个可以“迭代”的 Python 对象,也就是说,它将按顺序返回项目,以便您可以在 for
循环中使用它。 例如,当您想要确定列表中的所有或任何元素是否满足特定条件,或者查找列表中的最大或最小元素时,内置函数很有用。
在本教程中,您将使用内置函数 all
、any
、max
和 min
。
先决条件
为了充分利用本教程,建议拥有:
- 熟悉 Python 3 中的编程。 您可以查看我们的 How To Code in Python 3 教程系列以了解背景知识。
- Python 交互式控制台,如果您想试用本教程中的示例代码,您可以使用 如何使用 Python 交互式控制台 教程。
使用 all
内置函数 all
检查迭代中的每个元素是否都是 True
。 例如:
all([True, True])
如果您运行前面的代码,您将收到以下输出:
OutputTrue
在第一个示例中,您调用 all
并给它一个包含两个元素的列表(两个 True
布尔值)。 由于迭代中的每个元素都是 True
,因此输出是 True
。
如果给定可迭代对象中的一个或多个元素是 False
,则 all
将返回 False
:
all([True, False, True])
如果您运行前面的代码,您将收到以下输出:
OutputFalse
您使用包含三个元素的列表调用 all
,其中包括一个 False
布尔值。 由于可迭代的元素之一是 False
,因此对 all
的调用的输出是 False
。
值得注意的是,all
停止迭代并在遇到可迭代的第一个 False
条目时立即返回 False
。 因此,如果您想检查可能相互依赖的连续条件,但只要一个条件是 False
就立即返回,all
可能很有用。
需要注意的一个特殊情况是 all
被赋予一个空的可迭代对象:
all([])
如果您运行前面的代码,您将收到以下输出:
OutputTrue
当你给 all
一个空的可迭代对象(例如,像 all([])
这样的空列表)时,它的返回值为 True
。 因此,如果可迭代对象中的每个元素都为 True 或有 0 个元素,则 all
返回 True
。
all
在与生成器和自定义条件结合使用时特别有用。 与编写完整的 for
循环相比,使用 all
通常更短、更简洁。 让我们考虑一个示例来找出列表中是否存在以 "s"
开头的元素:
animals = ["shark", "seal", "sea urchin"] all(a.startswith("s") for a in animals)
如果您运行前面的代码,您将收到以下输出:
OutputTrue
您使用 generator 作为参数调用 all
。 生成器根据动物是否以字母 s
开头,为 animals
列表中的每个元素生成一个布尔值。 最终返回值为 True
,因为 animals
列表中的每个元素都以 s
开头。
注意: 您通常可以使用 生成器表达式 代替列表推导式来节省内存。 例如,考虑 all(i < 8 for i in range(3))
和 all([i < 8 for i in range(3)])
。 两个语句都返回 True
因为 0、1、2 都小于 8。 然而,第二个示例(使用列表推导式)增加了隐式创建三个条目长的列表 ([True, True, True]
) 的开销,然后将该列表传递给 all
函数。 相比之下,第一个示例(使用生成器表达式)将生成器对象传递给 all
函数,all
函数直接对其进行迭代,而无需中间列表的开销。
考虑使用成熟的 for
循环编写的等效代码会更加冗长:
animals = ["shark", "seal", "sea urchin"] def all_animals_start_with_s(animals): for a in animals: if not a.startswith("s"): return False return True print(all_animals_start_with_s(animals))
如果没有 all
,则用于确定是否所有动物都以字母 s
开头的代码需要多行代码才能实现。
接下来,您将查看 all
的兄弟函数:any
。
使用 any
您可以使用内置函数 any
来检查迭代中的任何元素是否为 True
。 例如:
any([False, True])
如果您运行前面的代码,您将收到以下输出:
OutputTrue
您调用 any
并给它一个包含两个元素的列表(一个 False
布尔值和一个 True
布尔值)。 由于可迭代对象中的一个或多个元素是 True
,因此输出也是 True
。
any
将返回 False
当且仅当给定迭代中的 0 个元素是 True
:
all([False, False, False])
如果您运行前面的代码,您将收到以下输出:
OutputFalse
您调用 any
并使用包含三个元素的列表(所有 False
布尔值)。 由于迭代中的 0 个元素是 True
,因此对 any
的调用的输出是 False
。
值得注意的是,any
停止迭代并在遇到可迭代的第一个 True
条目时立即返回 True
。 因此,如果您想检查连续的条件,any
会很有用,但只要有一个条件是 True
,就会立即返回。
any
— 就像它的兄弟方法 all
— 在与生成器和自定义条件(代替完整的 for
循环)结合使用时特别有用。 让我们考虑一个示例来确定列表中是否存在以 "urchin"
结尾的元素:
animals = ["shark", "seal", "sea urchin"] any(s.endswith("urchin") for s in animals)
您将收到以下输出:
OutputTrue
您使用生成器作为参数调用 any
。 生成器根据动物是否以 urchin
结尾,为 animals
列表中的每个元素生成一个布尔值。 最终返回值为 True
,因为 animals
列表中的一个元素以 urchin
结尾。
注:当给any
一个空的iterable时(例如,像any([])
这样的空列表),它的返回值为False
。 因此,如果可迭代对象中有 0 个元素或可迭代对象中的所有元素也是 False
,则 any
返回 False
。
接下来,您将查看另一个内置函数:max
。
使用 max
内置函数 max
返回其参数中给定的最大元素。 例如:
max([0, 8, 3, 1])
max
给出了一个列表,其中有四个整数作为其参数。 max
的返回值是该列表中最大的元素:8
。
输出将如下:
Output8
如果给定两个或多个位置参数(而不是带有可迭代的单个位置参数),max
返回给定参数中的最大值:
max(1, -1, 3)
如果您运行前面的代码,您将收到以下输出:
Output3
max
有三个单独的参数,其中最大的是 3
。 因此,调用 max
的返回值为 3
。
就像 any
和 all
一样,max
特别有用,因为它比编写为完整 for
循环的等效代码需要更少的行数。
max
也可以处理比数字更复杂的对象。 例如,您可以将 max
与程序中的字典或其他自定义对象一起使用。 max
可以通过使用名为 key
的关键字参数来容纳这些对象。
您可以使用 key
关键字参数定义自定义函数,该函数确定比较中使用的值以确定最大值。 例如:
entries = [{"id": 9}, {"id": 17}, {"id": 4}] max(entries, key=lambda x: x["id"])
输出将如下:
Output{'id': 17}
您调用 max
并将字典列表作为其输入。 您将匿名 lambda
函数作为 key
关键字参数。 max
为 entries
列表中的每个元素调用 lambda
函数,并返回给定元素的 "id"
键的值。 最终返回值是 entries
中的第二个元素:{"id": 17}
。 entries
中的第二个元素具有最大的 "id"
值,因此被认为是最大元素。
请注意,当 max
使用空的可迭代对象调用时,它会拒绝操作,而是引发 ValueError
:
max([])
如果您运行此代码,您将收到以下输出:
OutputTraceback (most recent call last): File "max.py", line 1, in <module> max([]) ValueError: max() arg is an empty sequence
你用一个空列表作为参数调用 max
。 max
不接受此作为有效输入,而是引发 ValueError
异常。
max
有一个名为 min
的对应项,您将在接下来查看它。
使用 min
内置函数 min
返回其参数中给出的最小元素。 例如:
min([8, 0, 3, 1])
你给 min
一个以四个整数作为参数的列表。 min
的返回值是该列表中的最小元素:0
。
输出将是:
Output0
如果给定两个或多个位置参数(而不是带有可迭代的单个位置参数),min
返回给定参数中的最小值:
min(1, -1, 3)
如果您运行前面的代码,您将收到以下输出:
Output-1
你给 min
三个单独的参数,其中最小的是 -1
。 因此,调用 min
的返回值为 -1
。
与 max
一样,min
支持名为 key
的关键字参数,因此您可以将比数字更复杂的对象传递给它。 使用 key
参数允许您将 min
函数与您的程序可能定义的任何自定义对象一起使用。
您可以使用 key
关键字参数定义自定义函数,该函数确定比较中使用的值以确定最小值。 例如:
entries = [{"id": 9}, {"id": 17}, {"id": 4}] min(entries, key=lambda x: x["id"])
Output{'id': 4}
您调用 min
并将字典列表作为其输入。 您将匿名 lambda
函数作为 key
关键字参数。 min
为 entries
列表中的每个元素调用 lambda
函数,并返回给定元素的 "id"
键的值。 最终返回值是 entries
中的第三个元素:{"id": 4}
。 entries
中的第三个元素具有较小的 "id"
值,因此被认为是最小元素。
与 max
一样,当您使用空的可迭代对象调用 min
时,它会拒绝操作,而是引发 ValueError
:
min([])
如果您运行前面的代码,您将收到以下输出:
OutputTraceback (most recent call last): File "min.py", line 1, in <module> min([]) ValueError: min() arg is an empty sequence
你用一个空列表作为参数调用 min
。 min
不接受此作为有效输入,而是引发 ValueError
异常。
结论
在本教程中,您使用了 Python 内置函数 all
、any
、max
和 min
。 您可以在 Python 文档 中了解更多关于函数 all
、any
、max
和 min
以及其他 Python 内置 的信息]。
有关其他 Python 内置函数的更多信息,您还可以查看 用于处理数字的内置 Python 3 函数、如何使用 Python 映射函数 和 如何使用 Python 过滤功能。