高阶函数
变量可以指向函数
函数本身可以赋值给变量,即:变量可以指向函数。
一个变量指向一个函数,可以直接通过该变量调用这个函数。
>>>f=abs
>>>f(-10)
10
函数名也是变量
函数名其实是指向函数的变量
传入函数
一个函数可以接收另一个函数作为参数,这种函数叫做高阶函数
filter()
filter()
用于过滤序列。
接收一个函数和一个序列,把传入的函数以此作用于每个元素,然后根据返回值是True
或False
决定保留或丢弃该元素
sorted()
sorted()
可以直接对list
排序
>>>sorted([36.5.-12,9,-21])
[-21, -12, 5, 9, 36]
sorted()
也是一个高阶函数,还可以接收一个key
函数实现自定义的排序。
>>>sorted([36,5,-12,9,-21],key=abs)
[5,9,-12,-21,36]
sorted()
对字符串排序,默认是按照ASCII码大小比较。
若想忽略大小写,按字母序排序,用key
函数将字符串都变成大写或小写字母,再比较
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
- 反向排序,可以传入第三个参数
reverse=True
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
返回函数
函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
闭包
- 闭包(closure):如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,则此内部函数被认为是闭包
- 闭包中是不能修改外部作用域的局部变量的
- 返回闭包时:返回函数不要引用任何循环变量,或后续会发生变化的变量。
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
>>>f1,f2,f3=count()
>>>f1()
1
>>>f2()
4
>>>f3()
9
装饰器
- 在代码运行期间动态增加功能的方式,称为
装饰器(Decorator)
装饰器(Decorator)
实际就是一个返回函数的高阶函数。- 在面向对象(OOP)的设计模式中,
decorator
被称为装饰模式。
OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator
外,直接从语法层次支持decorator
。
Python的decorator
既可以用函数实现,也可以用类实现。
偏函数(partial function)
- 函数在执行时,若有一个或多个参数可以预先用上,可以通过这个参数重新返回一个新的函数,然后调用这个新函数。
functools.partial
可以创建一个偏函数。如:
import functools
int2=functools.partial(int,base=2)
int2('1000000')