Python手动实现内置max/min函数兼容两类输入的问题咨询
Python自定义max/min函数兼容两种调用方式的实现方案
问题根源
- 使用
*a作为形参时,调用my_max(test)会把整个列表作为元组a的第一个元素,函数直接返回整个列表而非列表内的最大值,导致第一个断言失败 - 不使用
*a作为形参时,调用my_max(7,4,2,5)传入了4个参数,不符合单形参的函数定义,导致第二个断言失败
原生max()的核心逻辑是:如果仅传入1个位置参数,默认该参数为可迭代对象,遍历取值找最值;如果传入多个位置参数,直接在所有位置参数中找最值。
修正后的实现代码
def my_max(*args): if not args: raise TypeError("my_max() expects at least 1 argument, got 0") # 单参数场景:参数为可迭代对象 if len(args) == 1: iter_obj = args[0] max_v = next(iter(iter_obj)) for item in iter_obj: if item > max_v: max_v = item return max_v # 多参数场景:直接比较所有参数 else: max_v = args[0] for item in args[1:]: if item > max_v: max_v = item return max_v def my_min(*args): if not args: raise TypeError("my_min() expects at least 1 argument, got 0") # 单参数场景:参数为可迭代对象 if len(args) == 1: iter_obj = args[0] min_v = next(iter(iter_obj)) for item in iter_obj: if item < min_v: min_v = item return min_v # 多参数场景:直接比较所有参数 else: min_v = args[0] for item in args[1:]: if item < min_v: min_v = item return min_v test = [7, 4, 2, 6, 8] assert max(test) == my_max(test) and min(test) == my_min(test) assert max(7, 4, 2, 5) == my_max(7, 4, 2, 5) and min(7, 4, 2, 5) == my_min(7, 4, 2, 5) print("pass")
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

