重写python的max()方法,实现max所有功能
1、max()函数简介
max(*args,key=None)
1、可以比较多个相同类型的数值大小,按照ascall排序
max(1,2) = 2
max("a","b") = b
2、传入一个可迭代对象,计算得到最大值,默认使用ascall码排序
max("abcd") = d
max(["abc"],["bcd"]) = ["bcd"]
3、不传值会报错
max()
4、传入空的可迭代对象需要指定default值
max([])
max([],default=1) = 1
5、可以指定排序的方法,通过key传入
max("dsf","abcd",key=len) = "abcd"
max({"age":18},{"age":20},key=lambda dic:dic["age"]) = {"age":20}
以上就是max函数的使用方式,目前互联网上大多数都没有介绍max函数的key属性和default属性,本文详细讲解后,还会给出用python代码实现的max()函数
自定义max()函数实现
def get_key(key):
'''
获取传入的比较方法
:param key: 比较方法
:return: func
'''
if key == None:
key = lambda item:item
else:
key = key
return key
def get_max(a,b,method):
'''
根据传入的key方法比较大小
:param a: 比较对象
:param b: 比较对象
:param method: 比较对象依据的方法
:return: value
'''
if method(a) >= method(b):
return a
else:return b
def my_max(*args,key=None,**kwargs):
'''
传入可迭代对象或多个未知参数,返回最大值,key指定比较依据,传入函数
当可迭代对象为空时,必须指定default参数
:param args: 比较对象,可是是多个位置实参,也可是一个可迭代对象
:param key: 指定比较使用的方法,传入函数地址
:param kwargs: 当传入的可迭代对象为空时,指定default值
:return: value
'''
default = kwargs.get("default",None)
key = get_key(key)
if len(args) == 0:
raise ValueError("必须传入一个值")
if len(args) == 1:
if args[0]:
max_item = args[0][0]
for i in range(len(args[0])):
max_item = get_max(max_item,args[0][i],key)
return max_item
elif not args[0] and default == None:
raise ValueError("可迭代对象为空,必须指定default值")
elif not args[0]:
return default
else:
max_item = args[0]
for i in range(len(args)):
max_item = get_max(max_item,args[i],key)
return max_item
if __name__ == '__main__':
print(my_max('dfsdf'))
以上是代码实现,还请给位大佬指教
|