目录
1. 高阶函数
在Python中函数本身是一个变量,它可以接受传入的参数,可以用另一个变量指向这个函数,这时候的变量同样也就可以接受传入的参数。高阶函数就是指一种特殊的函数,它接受函数本身作为参数传入。
print(abs)
print(abs(-2))
temp = abs
print(temp(-8))
def higherOrder(n,func):
return func(n)
print(higherOrder(-83,abs))
map和reduce是两种高阶函数,前者接受一个函数和一个Itearable对象,它的用处是将接收到的函数作用到Iterable对象的每一个元素上,然后返回一个Iterator对象,用list得到所有结果;后者也是传入一个函数和一个序列,但是它要求传入的函数必须接受两个参数,reduce的作用是将序列的前两个元素带入函数计算,然后将返回值继续与后面的序列元素计算。
def multi(x):
return x * x
print(list(map(multi,[5,23,6,1,33,84])))
def add(a,b):
return a + b
from functools import reduce
print(reduce(add,[14,2,5,1]))
filter也是一种高阶函数,它同样接受一个函数和一个序列作为参数,返回Iterator对象。与上面的map和reduce不同的是它根据结果是True还是False决定是否将序列中的元素添加到结果中,也就是说filter实现的是对输入序列的筛选功能,接受的函数返回的是一个布尔值。
# 筛选序列中的奇数
def is_odd(x):
return x % 2 == 1
print(list(filter(is_odd,[1,23,4,5,6])))
下面要介绍的是排序函数sorted(),顾名思义它用于对序列进行排序,字符序列根据ASCII码大小来。sorted接受一个函数作为key,将这个函数作用到序列的每一个元素上产生一个新的序列,然后对这个新的序列排序,注意,返回的不是这个新的序列,而是新序列对应的原来的序列。
print(sorted(['a','B','w','x'])) #按ASCII排序
print(sorted(['a','B','w','x'],key=str.lower)) #忽略大小写
print(sorted(['a','B','w','x'],key=str.lower,reverse=True)) #倒序
2. 闭包
一个函数还可以返回函数,这个返回的函数包括上下文,这样返回一个函数的函数机制叫做闭包。内部的函数可以使用外面传入的参数,可以用在现在还不需要计算结果,先传入要计算的参数,等之后再计算的情况。需要注意的是内部函数不能返回一个后面会变化的量;即使传入的参数相同,每次返回的函数也都是不同的。
def puff(*num):
def sum():
a = 0
for i in num:
a = a + i
return a
return sum
s = puff(2,5,1)
s()
3. 匿名函数
匿名函数是一种只有一个表达式的函数,它不用定义函数名,直接返回表达式的结果,它也可以作为函数对象赋值给一个变量。使用匿名函数使代码更加简洁。
print(list(map(lambda x: x*x, [5,2,1,66])))
multi = lambda x: x*x
print(multi(4))
4. 装饰器
装饰器也是一种函数,用在需要在运行函数的上下文执行一些操作的时候。它通过在需要进行的操作上下文再包裹一层函数实现,为了防止函数__name__改变,需要在wrapper外加functools.wraps(func)。装饰器通过@使用,如果需要传入参数,需要再在外包裹一层函数。
def time():
print('2018/12/6')
f = time # 函数可赋值给变量
print(f.__name__) # 名称为函数名
print(f())
import functools
def deco(func):
@functools.wraps(func) # 防止func的__name__变成wrapper
def wrapper(*args,**kw): # 可以传入任意参数
print("运行:",func.__name__)
return func(*args,**kw)
return wrapper
@deco #使用装饰器,相当于time=deco(time)
def time():
print('这个函数')
print(time())
def pp(sb): # 装饰器本身需要传入参数时
def deco(func):
@functools.wraps(func) # 防止func的__name__变成wrapper
def wrapper(*args,**kw):
print(sb,'运行',func.__name__)
return func(*args,**kw)
return wrapper
return deco
@pp('你') #相当于time=pp('你')(time)
def time():
print('这个函数')
print(time())
# 练习:在函数运行前后打印log
def deco(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print('begin call')
func(*args,**kw)
print('end call')
return wrapper
@deco
def time():
print('ei')
time()
5. 偏函数
偏函数用于需要将函数的某些参数固定的时候,比如int函数默认转换成十进制,可以修改成默认转换成二进制。
print(int('1000',base=8)) # base表示转换的进制,默认为10
import functools
int2 = functools.partial(int, base=2)
print(int2('1000'))