高阶函数
函数也是变量,函数参数为函数的函数,称作高阶函数
- 自定义高阶函数
f = abs
myAbs(-3, f) --3
def myAbs(n, f):
return f(n)
- 内建高阶函数
map/reduce
map:iterator map(function, iterable),function作用于iterable
reduce:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4),f必须接收两个参数
filter
iterator map(function, iterable),function作用于iterable,然后根据返回值是True还是False决定保留还是丢弃该元素
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
结果: [1, 5, 9, 15]
sorted
iterator sorted(iterable, key=function),function作用于iterable,根据function返回值进行排序;不要key,则默认从小到大顺序排列
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
结果:['about', 'bob', 'Credit', 'Zoo']
def sortFunc(t):
return abs(t[1])
L = [('Bob', 75), ('Adam', -92), ('Bart', 66), ('Lisa', 88)]
L = sorted(L, key=sortFunc)
print(L)
结果:[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', -92)]
- 返回函数
函数里面返回函数,在函数第二次调用时生效。
牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量
闭包计数器
def createCounter1():
li = [0]
def counter():
li.append(li[-1] + 1)
return li[-1]
return counter
f = createCounter1();
print(f())
print(f())
print(f())
print(f())
print(f())
1
2
3
4
5
- 匿名函数
x就是参数
f = lambda x: x * x
f(5) --25
- 装饰器函数
想在函数执行的前后加入打印日志,类似面向切面编程的概念
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(text):
def decorator(func):
//将wrapper.__name__的属性名改为func.__name__
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log
def now():
print('2015-3-25')
执行 -- now()
- 偏函数
functools.partial(int, 参数)创建一个偏函数
import functolls
int2 = functools.partial(int, base=2)二进制
int2(4) --100
网友评论