pin_drop当前位置:知识文库 ❯ 图文
Python max和min函数 - 求最大值最小值
目录
一、max()和min()函数简介
max() 和 min() 是Python最常用的内置函数之一,用于从可迭代对象或多个参数中找出最大值和最小值。它们支持多种使用方式,包括可迭代对象遍历、多参数比较、自定义排序规则和默认值处理。
这两个函数是Python内置的,无需导入任何模块即可直接使用,在日常编程、数据处理和算法实现中都有广泛应用。
二、基本用法:可迭代对象
max()和min()最基本的用法是传入一个可迭代对象(如列表、元组、集合、字符串等),函数会遍历该对象并返回最大值或最小值。
示例1:数字列表的最大值和最小值
代码示例
# 数字列表
numbers = [42, 17, 89, 3, 56, 28, 71]
max_val = max(numbers)
min_val = min(numbers)
print(f"列表: {numbers}")
print(f"最大值: {max_val}")
print(f"最小值: {min_val}")
# 输出结果
# 列表: [42, 17, 89, 3, 56, 28, 71]
# 最大值: 89
# 最小值: 3
示例2:字符串比较
代码示例
# 字符串比较(按字典序)
words = ["apple", "banana", "cherry", "date", "elderberry"]
max_word = max(words)
min_word = min(words)
print(f"字典序最大的单词: {max_word}")
print(f"字典序最小的单词: {min_word}")
# 输出结果
# 字典序最大的单词: elderberry
# 字典序最小的单词: apple
示例3:元组和集合
代码示例
# 元组
temperatures = (23.5, 25.1, 19.8, 27.3, 22.0)
print(f"最高温度: {max(temperatures)}")
print(f"最低温度: {min(temperatures)}")
# 集合
unique_scores = {95, 87, 92, 78, 100, 85}
print(f"最高分: {max(unique_scores)}")
print(f"最低分: {min(unique_scores)}")
# 输出结果
# 最高温度: 27.3
# 最低温度: 19.8
# 最高分: 100
# 最低分: 78
三、多参数比较
max()和min()可以直接接收多个参数进行比较,而不需要将它们放在列表中。这种方式在比较少量值时非常方便。
示例1:直接比较多个数值
代码示例
# 直接传入多个参数
result1 = max(15, 42, 8, 33, 19)
result2 = min(15, 42, 8, 33, 19)
print(f"最大值: {result1}")
print(f"最小值: {result2}")
# 输出结果
# 最大值: 42
# 最小值: 8
示例2:比较字符串
代码示例
# 比较多个字符串
longest = max("Python", "JavaScript", "Java", "C++", key=len)
shortest = min("Python", "JavaScript", "Java", "C++", key=len)
print(f"最长的语言: {longest}")
print(f"最短的语言: {shortest}")
# 输出结果
# 最长的语言: JavaScript
# 最短的语言: C++
四、key参数自定义排序规则
key 参数允许我们传入一个函数,用于自定义比较规则。max()和min()会根据key函数的返回值来确定最大值或最小值,但返回的是原始元素本身。
示例1:按字符串长度比较
代码示例
fruits = ["apple", "blueberry", "banana", "fig", "pomegranate"]
# 按长度找最长和最短的水果
longest = max(fruits, key=len)
shortest = min(fruits, key=len)
print(f"最长的水果: {longest} (长度: {len(longest)})")
print(f"最短的水果: {shortest} (长度: {len(shortest)})")
# 输出结果
# 最长的水果: pomegranate (长度: 11)
# 最短的水果: fig (长度: 3)
示例2:字典列表按值排序
代码示例
# 学生成绩列表
students = [
{"name": "张三", "score": 85, "age": 20},
{"name": "李四", "score": 92, "age": 19},
{"name": "王五", "score": 78, "age": 21},
{"name": "赵六", "score": 95, "age": 20},
]
# 找分数最高的学生
best_student = max(students, key=lambda x: x["score"])
# 找年龄最小的学生
youngest_student = min(students, key=lambda x: x["age"])
print(f"最高分学生: {best_student['name']} - {best_student['score']}分")
print(f"最小年龄学生: {youngest_student['name']} - {youngest_student['age']}岁")
# 输出结果
# 最高分学生: 赵六 - 95分
# 最小年龄学生: 李四 - 19岁
示例3:按绝对值比较
代码示例
numbers = [-50, 23, -8, 45, -33, 12]
# 按绝对值找最大和最小
max_abs = max(numbers, key=abs)
min_abs = min(numbers, key=abs)
print(f"绝对值最大的数: {max_abs} (绝对值: {abs(max_abs)})")
print(f"绝对值最小的数: {min_abs} (绝对值: {abs(min_abs)})")
# 输出结果
# 绝对值最大的数: -50 (绝对值: 50)
# 绝对值最小的数: -8 (绝对值: 8)
示例4:自定义函数作为key
代码示例
def get_second_element(item):
"""获取元组的第二个元素"""
return item[1]
# 坐标点列表
points = [(1, 5), (3, 2), (7, 8), (2, 9), (5, 1)]
# 按y坐标找最高和最低点
highest_y = max(points, key=get_second_element)
lowest_y = min(points, key=get_second_element)
print(f"y坐标最高的点: {highest_y}")
print(f"y坐标最低的点: {lowest_y}")
# 输出结果
# y坐标最高的点: (2, 9)
# y坐标最低的点: (5, 1)
五、default默认值参数
当传入的可迭代对象为空时,max()和min()默认会抛出 ValueError 异常。使用 default 参数可以指定空迭代对象时的返回值,避免程序崩溃。
示例1:处理空列表
代码示例
empty_list = []
# 不使用default会抛出异常
# max(empty_list) # ValueError: max() arg is an empty sequence
# 使用default参数
result1 = max(empty_list, default=0)
result2 = min(empty_list, default=None)
print(f"空列表max: {result1}")
print(f"空列表min: {result2}")
# 输出结果
# 空列表max: 0
# 空列表min: None
示例2:实际应用场景
代码示例
def get_max_temperature(temperatures):
"""安全地获取最高温度"""
return max(temperatures, default="无数据")
def get_min_price(prices):
"""安全地获取最低价格"""
return min(prices, default=-1)
# 测试
today_temps = [22, 25, 28, 24]
no_data = []
print(f"今日最高温: {get_max_temperature(today_temps)}")
print(f"今日最高温: {get_max_temperature(no_data)}")
print(f"最低价格: {get_min_price(no_data)}")
# 输出结果
# 今日最高温: 28
# 今日最高温: 无数据
# 最低价格: -1
注意:default参数只能用于可迭代对象调用方式,不能用于多参数比较方式。例如
max(1, 2, 3, default=0)会报错。
六、max()与min()对比表格
七、注意事项
-
类型一致性:比较的元素必须是可比较的类型,混合类型比较会抛出
TypeError。例如max([1, "a"])会报错。 -
返回原始元素:使用key参数时,max()/min()返回的是原始元素,而不是key函数的返回值。如果需要返回值,需要额外处理。
-
相等元素:当有多个元素具有相同的最大/最小值时,返回第一个遇到的元素。
-
性能考虑:max()和min()都需要遍历整个可迭代对象,时间复杂度为O(n)。对于大型数据集,这是必要的开销。
-
default参数限制:default参数仅在使用可迭代对象调用方式时有效,多参数比较时不能使用default。
小贴士
同时获取最大值和最小值:如果需要同时获取最大值和最小值,可以使用 min_val, max_val = min(data), max(data),但这样会遍历两次数据。对于大数据集,可以考虑使用单次遍历的自定义函数来优化性能。Python 3.4+还支持 statistics 模块中的其他统计函数。
常见问题
max()和min()可以用于自定义对象吗?
可以。自定义对象需要实现 __lt__、__gt__ 等比较魔术方法,或者通过key参数指定比较规则。例如 max(objects, key=lambda x: x.score)。
如何处理包含None值的列表?
可以使用生成器表达式过滤None值:max(x for x in data if x is not None),或者使用key参数处理:max(data, key=lambda x: x if x is not None else float('-inf'))。
max()和min()的时间复杂度是多少?
max()和min()的时间复杂度都是O(n),其中n是可迭代对象的元素数量。它们需要遍历所有元素一次来确定最大值或最小值。空间复杂度为O(1),因为只需要常数级别的额外空间。
可以在生成器表达式中使用max()和min()吗?
完全可以。生成器表达式是惰性求值的,与max()/min()结合使用可以节省内存。例如 max(x**2 for x in range(1000000)) 不会创建中间列表,内存效率很高。
十、练习题
练习1
给定一个学生列表,每个学生是包含"name"、"score"、"grade"键的字典。请使用max()和min()找出:(1) 分数最高的学生;(2) 年级最低的学生;(3) 名字最长的学生。编写完整代码并测试。
练习2
编写一个函数 find_extremes(data),接收一个数字列表,返回一个元组 (最小值, 最大值, 绝对值最小的数, 绝对值最大的数)。要求处理空列表情况,返回None或合适的默认值。
本文涉及AI创作
内容由AI创作,请仔细甄别