1.高阶函数
将函数作为参数传入
1)map/reduce
map:传入两个参数,一个是函数,一个是迭代器,主要作用是将运算规则抽象化表达,如:
>>> def f(x):
return x * x
>>> r = map(f,[1,2,3,4,5,6,7])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49]
reduce:传入两个参数,做累计效果
将[1,3,5,6]变成1356
>>> from functools import reduce
>>> def fn(x,y):
return x*10 + y
>>> reduce(fn,[1,3,5,6])
1356
也可将str转换成int
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn, map(char2num, s))
2)fliter:用于过滤序列
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
3)sorted:排序操作,实现字符串、列表等的排序
默认是从小到大排序
>>> sorted([36,2,-34,5,9]) [-34, 2, 5, 9, 36]
也可以接受一个key,做自定义排序,此处按照绝对值大小进行排序
>>> sorted([39,-37,-1,-39],key=abs) [-1, -37, 39, -39]
2.返回函数
返回的函数在其定义内部引入了局部变量,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用
如下所示:原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
>>> f1() 9 >>> f2() 9 >>> f3() 9
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
3.匿名函数
def is_odd(n):
return n % 2 == 1
L = list(filter(is_odd, range(1, 20)))
L = list(filter(lambda x: x % 2 == 1, range(1, 20)))
4.装饰器函数
完整的装饰器函数写法:
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
5.偏函数
简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。