优秀的编程知识分享平台

网站首页 > 技术文章 正文

python常用得内置函数解析——min()函数

nanyue 2025-09-14 23:56:07 技术文章 2 ℃

接下来给各位道友详细解析 Python 中另一个非常常用的内置函数 min()。

1. 函数定义

min() 函数用于返回给定参数中的最小值

它有两种调用方式:

  1. min(iterable, *[, key, default]) - 接受一个可迭代对象
  2. 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. 注意事项和常见错误

  1. 空可迭代对象:如果不提供 default 参数且可迭代对象为空,会抛出 ValueError。
  2. 不可比较的类型:如果元素类型不同且无法比较,会抛出 TypeError。
  1. # print(min([1, 'a'])) # TypeError: '<' not supported between instances of 'str' and 'int'
  2. key 函数的性能:key 函数会被调用多次(对于每个元素),对于大型数据集,应该确保 key 函数是高效的。

7. 与max()函数的关系

min() 和 max() 是一对互补的函数,它们的参数和用法完全一致,只是功能相反:

  • min() 返回最小值
  • max() 返回最大值

总结

特性

描述

功能

返回给定参数中的最小值

两种形式

min(iterable) 或 min(arg1, arg2, ...)

关键参数

key:自定义比较逻辑
default:空可迭代对象的默认返回值

比较机制

使用 < 运算符进行比较

适用类型

任何可比较的数据类型(数字、字符串、自定义对象等)

常见用途

找最小值、基于特定条件筛选、数据处理等

min() 是一个极其灵活和强大的函数,特别是配合 key 参数使用,可以解决很多复杂的最小值查找问题。

最近发表
标签列表