网站首页 > 技术文章 正文
接下来给各位道友详细解析 Python 中另一个非常常用的内置函数 min()。
1. 函数定义
min() 函数用于返回给定参数中的最小值。
它有两种调用方式:
- min(iterable, *[, key, default]) - 接受一个可迭代对象
- min(arg1, arg2, *args[, key]) - 接受两个或多个位置参数
- 参数:
- iterable: 可迭代对象,如列表、元组、集合、字符串等
- arg1, arg2, *args: 两个或多个进行比较的元素
- key: 指定一个函数,用于从每个元素中提取比较键(可选)
- default: 当可迭代对象为空时返回的值(可选,仅用于可迭代对象形式)
- 返回值: 参数中的最小值。
2. 基本用法示例
方式一:传入多个参数
# 比较数字
print(min(1, 2, 3)) # 输出: 1
print(min(-5, 10, 0)) # 输出: -5
# 比较字符串(按字母顺序/ASCII码)
print(min('apple', 'banana', 'cherry')) # 输出: 'apple'
print(min('Z', 'a')) # 输出: 'Z' (因为大写字母ASCII码小于小写字母)
# 混合类型(需要可比较)
print(min(1, 2.5, 3)) # 输出: 1 (整数和浮点数可以比较)
方式二:传入可迭代对象
# 数字列表
numbers = [3, 1, 4, 1, 5, 9, 2]
print(min(numbers)) # 输出: 1
# 字符串列表
fruits = ['apple', 'banana', 'cherry']
print(min(fruits)) # 输出: 'apple'
# 元组
tuple_nums = (10, 5, 8, 3)
print(min(tuple_nums)) # 输出: 3
# 字符串(比较字符的ASCII码)
text = "hello"
print(min(text)) # 输出: 'e' (因为 'e' 的ASCII码是101,'h'是104,'l'是108,'o'是111)
3. 高级用法:key参数
key 参数是 min() 函数最强大的功能之一。它接受一个函数,该函数会被应用到每个元素上,然后基于函数的返回值进行比较。
示例1:按字符串长度找最短的
words = ['apple', 'banana', 'cherry', 'date']
# 不使用 key
print(min(words)) # 输出: 'apple' (按字母顺序)
# 使用 key,按长度比较
print(min(words, key=len)) # 输出: 'date' (长度最短)
示例2:找字典中值最小的项
students = [
{'name': 'Alice', 'score': 85},
{'name': 'Bob', 'score': 92},
{'name': 'Charlie', 'score': 78}
]
# 找到分数最低的学生
lowest_score = min(students, key=lambda x: x['score'])
print(lowest_score) # 输出: {'name': 'Charlie', 'score': 78}
# 只获取分数最低的学生的名字
lowest_name = min(students, key=lambda x: x['score'])['name']
print(lowest_name) # 输出: Charlie
示例3:自定义复杂比较
# 按第二个元素找最小值
pairs = [(1, 9), (2, 5), (3, 7)]
print(min(pairs, key=lambda x: x[1])) # 输出: (2, 5)
# 忽略大小写比较字符串
words = ['Apple', 'banana', 'CHERRY']
print(min(words, key=str.lower)) # 输出: 'Apple'
4.default参数
当处理可能为空的可迭代对象时,使用 default 参数可以避免 ValueError。
# 空列表会报错
empty_list = []
# print(min(empty_list)) # ValueError: min() arg is an empty sequence
# 使用 default 参数
print(min(empty_list, default="列表为空")) # 输出: 列表为空
print(min(empty_list, default=0)) # 输出: 0
# 非空列表时,default 无效
numbers = [5, 2, 8]
print(min(numbers, default=0)) # 输出: 2 (不是0)
5. 底层原理和自定义对象
min() 函数通过比较运算符 < 来比较元素。对于自定义对象,你需要实现 __lt__() 方法(小于比较)来支持 min()。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
"""定义如何比较两个人的年龄"""
return self.age < other.age
def __repr__(self):
return f"Person({self.name}, {self.age})"
# 创建 Person 对象列表
people = [
Person("Alice", 25),
Person("Bob", 30),
Person("Charlie", 20)
]
# 找出年龄最小的人
youngest = min(people)
print(youngest) # 输出: Person(Charlie, 20)
# 也可以使用 key 参数
youngest_by_key = min(people, key=lambda p: p.age)
print(youngest_by_key) # 输出: Person(Charlie, 20)
6. 注意事项和常见错误
- 空可迭代对象:如果不提供 default 参数且可迭代对象为空,会抛出 ValueError。
- 不可比较的类型:如果元素类型不同且无法比较,会抛出 TypeError。
- # print(min([1, 'a'])) # TypeError: '<' not supported between instances of 'str' and 'int'
- key 函数的性能:key 函数会被调用多次(对于每个元素),对于大型数据集,应该确保 key 函数是高效的。
7. 与max()函数的关系
min() 和 max() 是一对互补的函数,它们的参数和用法完全一致,只是功能相反:
- min() 返回最小值
- max() 返回最大值
总结
特性 | 描述 |
功能 | 返回给定参数中的最小值 |
两种形式 | min(iterable) 或 min(arg1, arg2, ...) |
关键参数 | key:自定义比较逻辑 |
比较机制 | 使用 < 运算符进行比较 |
适用类型 | 任何可比较的数据类型(数字、字符串、自定义对象等) |
常见用途 | 找最小值、基于特定条件筛选、数据处理等 |
min() 是一个极其灵活和强大的函数,特别是配合 key 参数使用,可以解决很多复杂的最小值查找问题。
猜你喜欢
- 2025-09-14 在Excel用max()/min()函数代替IF()函数的多分支判断的一个小案例
- 2025-09-14 【C语法硬核20讲】07 宏与预处理:写出安全宏
- 2025-09-14 用数学的方法理解Photoshop混合模式——变暗模式
- 2025-09-14 这4个变态的Excel函数公式,却好用的很
- 2025-09-14 常用函数示例_常用函数示例大全
- 2025-09-14 Excel教程:常用的Excel统计函数汇总
- 2025-09-14 办公小技巧:用好Excel 2019新函数为办公提速
- 2025-09-14 如何实现一个带min函数的栈?这招双栈法让查询速...
- 2025-07-10 Python 元组(Tuple)详解(python元组用来做什么)
- 2025-07-10 Excel如何去除前导0,中间和末尾的0不去除?送大家一条通用公式
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)