如何在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 过滤功能。