Python min 函数
上次修改时间:2025 年 4 月 11 日
这份综合指南探讨了 Python 的 min 函数,该函数返回可迭代对象中最小的项目或参数中的最小值。我们将介绍基本用法、键函数、自定义对象和实际示例。
基本定义
min 函数返回可迭代对象中最小的项目,或者两个或多个参数中的最小值。 它可以与任何可比较的对象一起使用。
主要特点:接受可迭代对象或多个参数,可选的键函数用于自定义比较,以及用于空可迭代对象的默认值。 适用于数字、字符串和实现比较的自定义对象。
基本数字用法
这是一个使用数字的简单用法,展示了 min 如何在不同场景中找到最小值。
# 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 函数接受一个键参数用于自定义比较。 此示例查找最短的字符串和具有最低值的字典项。
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 类。
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_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 性能与查找最小值的替代方法。
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,但可读性较差。 内置函数在性能和清晰度方面都是首选。
最佳实践
- 用于提高可读性: 优先选择
min而不是手动循环 - 实现 __lt__: 对于需要自然排序的自定义类型
- 使用键函数: 用于在不修改数据的情况下进行复杂的比较
- 处理空情况: 使用默认参数或显式检查
- 记录行为: 清楚地记录比较逻辑
资料来源
作者
列出所有 Python 教程。