max(iterable[, args...][, key])
With a single argument iterable, return the largest item of a non-empty iterable (such as a string, tuple or list). With more than one argument, return the largest of the arguments.
首先,这里表示了max中需要包括的两个参数(注意,是两个,而不是三个),其中iterable是形容词,也就是说第一个args元素集合中每个对象都是可迭代的(这里的集合不是py中的集合,只表示元素的总合)。
对于args来说,分为两种情况:单元素和多元素。对于单元素而言,结果是该对象中的某一项(如果是字符串,则结果是字符,如果是列表或者元组,结果就是其中一个元素)。如果是多元素,则结果是某个元素。
The optional key argument specifies a one-argument ordering function like that used for list.sort(). The key argument, if supplied, must be in keyword form (for example, max(a,b,c,key=func)).
这里的key参数是可有可无的。如果是没有的话,那返回的结果就是默认值(如多个数字,则是最大的数,如果是多个字符串,则返回首字母ascii最大的字符串,这里不进行赘述)。
我们重点讨论包括key参数的情况。刚才讲到了args的单元素和多元素,其实和这里是紧密相关的。
我们先举两个例子,用map、reduce、filter三个函数分别实现在单元素和多元素情况下的max。
单元素
text ='apple abstract'
max('abcdefghiz', key = text.count) #这里的key=必不可少,否则会不起作用
data = 'apple abstract'
s = 'abcdefghiz'
m = map(lambda x,y:x.count(y), [data]*len(s), s)
r = reduce(max, m)
result = filter(lambda x:data.count(x)==r, data)[0]
多元素
max('ah', 'bf', key = lambda x:x[1]) #这里的key=必不可少,否则会不起作用
data = ['ah', 'bf']
m = map(lambda x:x[1], data)
r = reduce(max, m)
result = filter(lambda x:x[1]==r, data)[0]
需要我们注意的是,在这两种情况下,函数的调用方和被调用方是不同的。在单元素情况下,函数的调用方是在key中的,函数的调用参数是在args中的,而且调用参数是变化的,是对args中的值进行迭代的。而在多元素情况下,调用方是在args中的。