如果一个函数能接收一个函数为参数或返回一个函数,那这个函数就被称为高阶函数。
1. sorted
sorted可以说是最常用的高阶函数,其用法如下:
m = {"three": 3, "tow": 2, "one": 1
sorted(m.items(), key=lambda x: x[1]) # [('one', 1), ('tow', 2), ('three', 3)]
sorted可根据其参数key返回的值来进行排序。
2. map
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
如:
def add10(x):
return x+10
print(map(add10, [1, 2, 3])) # <map object at 0x7f5824cd01c0>
list(map(add10, [1, 2, 3])) # [11, 12, 13]
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']
functools.reduce
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) 例如:
from functools import reduce
from operator import mul
reduce(mul, range(1, 5)) # 24 (1*2*3*4)
filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
用法:
def even(x:int) -> bool:
"""判断是否是奇数
"""
if x % 2 == 0:
return False
else:
return True
list(filter(even, range(1, 10))) # [1, 3, 5, 7, 9]
zip
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
用法:
a = ["one", "two", "three"]
b = [1, 2, 3, 4]
list(zip(a, b)) # [('one', 1), ('two', 2), ('three', 3)]
operator.attrgetter
返回一个可从操作数中获取 attr 的可调用对象。 如果请求了一个以上的属性,则返回一个属性元组。 属性名称还可包含点号。 例如:
在 f = attrgetter(‘name’) 之后,调用 f(b) 将返回 b.name。
在 f = attrgetter(‘name’, ‘date’) 之后,调用 f(b) 将返回 (b.name, b.date)。
在 f = attrgetter(‘name.first’, ‘name.last’) 之后,调用 f(b) 将返回 (b.name.first, b.name.last)。
用法:
from collections import namedtuple
Name = namedtuple('Name', 'firstname lastname')
Person = namedtuple('Person', 'name age height')
myname = Name(firstname='li', lastname='chang')
me = Person(name=myname, age=18, height=180)
print(me) # Person(name=Name(firstname='li', lastname='chang'), age=18, height=180)
nameFn = attrgetter("name")
nameFn(me) # Name(firstname='li', lastname='chang')
firstNameFn = attrgetter("name.firstname")
firstNameFn(me) # 'li'
operator.itemgetter
返回一个使用操作数的 getitem() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。
例如:
在 f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]。
在 g = itemgetter(2, 5, 3) 之后,调用 g(r) 将返回 (r[2], r[5], r[3])。
用法:
from operator import itemgetter
index1 = itemgetter(1)
index1(range(1, 10)) # 2
index1(["one", "two", "three"]) # 'two'
functools.partial
称为偏函数,作用是把一个函数的某些参数给固定住
用法:
from functools import partial
def powN(a, n=2):
return a**n
powN(2) # 4
pow10 = partial(powN, n=10)
pow10(2) # 1024
当partial没有指定参数的名字时,会把参数加到被调用函数的参数列表左边,如:
from functools import partial
maxOr10 = partial(max, 10)
maxOr10(11) # 11
maxOr10(1) # 1