如何在Python中使用all、any、max和min函数

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

Python 包含许多 内置函数 ——这些是全局 Python 函数,可以从任何 Python 代码调用,而无需导入额外的模块。 例如,您可以随时调用 print 内置函数来输出文本。

其中的几个内置函数(allanymaxmin)取值的iterables为他们的论点并返回一个值。 iterable 是一个可以“迭代”的 Python 对象,也就是说,它将按顺序返回项目,以便您可以在 for 循环中使用它。 例如,当您想要确定列表中的所有或任何元素是否满足特定条件,或者查找列表中的最大或最小元素时,内置函数很有用。

在本教程中,您将使用内置函数 allanymaxmin

先决条件

为了充分利用本教程,建议拥有:

使用 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

就像 anyall 一样,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 关键字参数。 maxentries 列表中的每个元素调用 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

你用一个空列表作为参数调用 maxmax 不接受此作为有效输入,而是引发 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 关键字参数。 minentries 列表中的每个元素调用 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

你用一个空列表作为参数调用 minmin 不接受此作为有效输入,而是引发 ValueError 异常。

结论

在本教程中,您使用了 Python 内置函数 allanymaxmin。 您可以在 Python 文档 中了解更多关于函数 allanymaxmin 以及其他 Python 内置 的信息]。

有关其他 Python 内置函数的更多信息,您还可以查看 用于处理数字的内置 Python 3 函数如何使用 Python 映射函数如何使用 Python 过滤功能