ZetCode

Python min 函数

上次修改时间:2025 年 4 月 11 日

这份综合指南探讨了 Python 的 min 函数,该函数返回可迭代对象中最小的项目或参数中的最小值。我们将介绍基本用法、键函数、自定义对象和实际示例。

基本定义

min 函数返回可迭代对象中最小的项目,或者两个或多个参数中的最小值。 它可以与任何可比较的对象一起使用。

主要特点:接受可迭代对象或多个参数,可选的键函数用于自定义比较,以及用于空可迭代对象的默认值。 适用于数字、字符串和实现比较的自定义对象。

基本数字用法

这是一个使用数字的简单用法,展示了 min 如何在不同场景中找到最小值。

basic_min.py
# With multiple arguments
print(min(10, 20, 5))    # 5

# With an iterable
numbers = [15, 8, 42, 4]
print(min(numbers))      # 4

# With mixed types (works if comparable)
print(min(3.14, 2, 5.5)) # 2

此示例显示了带有不同数字输入的 min。 它适用于单独的参数和可迭代对象。 该函数返回找到的最小值。

请注意,混合数字类型(int 和 float)有效,因为 Python 可以比较它们。 但是,比较不兼容的类型会引发 TypeError。

使用键函数

min 函数接受一个键参数用于自定义比较。 此示例查找最短的字符串和具有最低值的字典项。

key_min.py
words = ["apple", "banana", "cherry", "date"]
print(min(words, key=len))  # 'date'

students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob", "score": 72},
    {"name": "Charlie", "score": 90}
]
print(min(students, key=lambda x: x["score"]))
# {'name': 'Bob', 'score': 72}

第一个示例使用 len 作为键来查找最短的字符串。 第二个示例使用 lambda 函数查找得分最低的学生。

键函数在比较之前转换项目,但返回原始项目。 这对于复杂的比较而不修改数据非常有用。

带有 __lt__ 的自定义对象

您可以通过实现 __lt__ 特殊方法使自定义对象与 min 一起使用。 此示例创建一个 Product 类。

custom_min.py
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    
    def __lt__(self, other):
        return self.price < other.price
    
    def __repr__(self):
        return f"Product({self.name}, ${self.price})"

products = [
    Product("Laptop", 999),
    Product("Phone", 699),
    Product("Tablet", 399)
]

print(min(products))  # Product(Tablet, $399)

Product 类实现 __lt__ 以按价格进行比较。 当我们在 Product 列表上调用 min 时,Python 使用此方法。

这种模式对于自然排序不明显的对象很有用。 键参数提供了一种无需修改类的替代方案。

处理空可迭代对象

对于空可迭代对象,min 函数会引发 ValueError。 此示例显示了使用默认值进行适当的错误处理。

empty_min.py
empty_list = []

# Raises ValueError
try:
    print(min(empty_list))
except ValueError as e:
    print(f"Error: {e}")  # min() arg is an empty sequence

# With default value
print(min(empty_list, default="No items"))  # 'No items'
print(min([], default=None))               # None

这些示例演示了 min 在空序列中的行为。 默认参数提供了一种安全的替代方案来处理异常。

在使用可能为空的数据时,始终考虑使用默认值或显式检查,以避免运行时错误。

性能注意事项

此示例比较了 min 性能与查找最小值的替代方法。

performance.py
import timeit
import random

numbers = [random.randint(1, 1000) for _ in range(10000)]

def test_min():
    return min(numbers)

def test_sorted():
    return sorted(numbers)[0]

def test_manual():
    min_val = numbers[0]
    for num in numbers[1:]:
        if num < min_val:
            min_val = num
    return min_val

print("min():", timeit.timeit(test_min, number=1000))
print("sorted()[0]:", timeit.timeit(test_sorted, number=1000))
print("Manual loop:", timeit.timeit(test_manual, number=1000))

此基准测试不同的最小查找方法。 min 针对此任务进行了优化,通常是最快的。 排序速度要慢得多,因为它会处理所有元素。

手动循环接近 min,但可读性较差。 内置函数在性能和清晰度方面都是首选。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程