函数式编程
函数式编程(funcitonal programming)其实是个很古老的概念。
高阶函数和内存分析
函数式一阶公民
- 函数式编程最鲜明的特点就是:函数式一等公民,指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
- 一个函数可以接受另一个函数作为参数,这种函数就称之为高阶函数
- python内建的高阶函数有map、reduce、filter、sorted
def test():print("test function run!!!")a = test
a()
当执行第一句话的时候,就给test变量分配了一个地址,然后在执行a=test的时候,会将test指向的地址分配给a,在执行a()就会去调用函数
def test():print("test function run!!!")def test2(func):print("test2 funciton run!!!")func()a = test
test2(a)
def test():print("test function run!!!")def test3(a, b):print(f"test3,{a},{b}")def test2(func, *args, **kwargs):print("test2 funciton run!!!")print(f"*args:{args}")func(*args, **kwargs)a = test
test2(a)
test2(test3, 100, 200)
偏函数
python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
偏函数:作用就是把一个函数某些参数固定住(也就是设置默认值),返回一个新的函数,调用这个新的函数会更简单
举例如下:
int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换,代码如下:
print(int('12345'))
def int2(x, base=2):return int(x, base)print(int2('10000'))
print(int2('1010101'))
闭包closure
根据字面意思,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数。当然,当然,还有函数内部对应的逻辑,包裹里面的东西就是自由变量(外部函数的局部变量),自由变量可以随着包裹到处游荡。
- 局部变量:如果名称绑定在一个代码块中,则为该代码块的局部变量,除非声明为nonlocal或global
- 全局变量:如果模块绑定在模块层级,则为全局变量
- 自由变量:如果变量在一个代码块中被使用但不是在其中定义,则为自由变量。
闭包概念和第一个闭包程序
我们知道,函数作用域是独立的,封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限。