Min and Max

时间:2021-08-14 05:26:47

Min and Max

需要处理不同数据类型; 另外*args, 表示的是位置参数, *kwargs表示的是key参数, args的类型为tuple类型, 参数为min(3, 2)时, args为(3, 2), 参数为min([3, 2])时, args为([3, 2], );

列表解析为[i for i in range(0, 1)], 而(i for i in range(0, 1))为generator, 通过.next()属性获取下一个元素, 它不像列表解析一次性生成所有元素, 每次调用next生成一个元素;

 1 def min(*args, **kwargs):
2 key = kwargs.get("key", None)
3
4 sort_source = args if len(args) > 1 else args[0] #tuple comprehension
5
6 if isinstance(sort_source, set):
7 rel = sort_source.pop()
8 elif type(sort_source) == type((i for i in range(0, 1))):
9 rel = sort_source.next()
10 else:
11 rel = sort_source[0]
12
13 if key != None:
14 for each in sort_source:
15 if key(each) < key(rel):
16 rel = each
17 else:
18 for each in sort_source:
19 if each < rel:
20 rel = each
21
22 return rel

观摩Cjkjvfnby的代码

 1 def get_first_from_sorted(args, key, reverse):
2 if len(args) == 1:
3 args = iter(args[0])
4 return sorted(args, key=key, reverse=reverse)[0]
5
6
7 def min(*args, key=None):
8 return get_first_from_sorted(args, key, False)
9
10
11 def max(*args, key=None):
12 return get_first_from_sorted(args, key, True)

无他, 在len(arg) == 1的情况, 仍然需要提取出实际的对象, 如([1, 2], )中的[1, 2]; 高明的地方在于使用了sorted, 省去了自己判断类型