一、匿名函数
- lambda # 关键字 和三目运算一样,做一些简单的函数定义,使代码更加简洁
- 语法规则:
lambda <参数>:表达式
filter(lambda x: x>10, li)
d = lambda a,b:a+b
d(1,2)
- 应用场景:
1.简单函数:简单的函数可以不使用def定义一个函数,使用匿名函数即可
2.函数调用:类似于filter、map等函数里面,可以使用匿名函数来处理
3.提高开放效率:名函数的合理利用能够让那个代码更加简洁
二、函数作用域
- 函数里面可以访问函数外面的变量
- 定义在函数里面的变量,函数外面是不能访问的
- 在函数里面可以访问最外面的(不可变)变量,但是不能对它修改,但可变类型(list set dict bytearray)就可以修改
- 函数外面定义的变量和函数里面定义的变量重名时,他们不是一个变量。函数里面的变量不影响外面的变量
- global和nonlocal
- global
a = 1 # 全局变量
def yu():
global a # global 关键字 声明a是全局变量,声明后在函数内部就可以修改这个变量
a = a+519
print(a)
yu()
-nonlocal
def yu():
a = 1 # 局部变量 在嵌套函数的时候会使用
def lo():
nonlocal a # 声明这个a是局部变量
a = a + 519
print(a)
lo()
yu()
三、闭包
外部调用函数内层的函数:由于作用域的问题,外部不能调用内部的变量,因此需要闭包。
def outside():
print('外层函数')
def inside(): # 函数里面嵌套函数
print(‘内层函数’)
return inside # 返还的是内层的函数名,是个变量,通过 函数名后面加()实现这个内层函数的调用。
a = outside() # 这里a的值为 inside 的函数名
a() # 也可以是 outside()() 实现了直接调用内层函数。
注意:
1. 函数的名字就相当于一个变量
2. 闭包可以得到外层函数的局部变量(通过return内层的函数名实现),是函数内部与外部沟通的桥梁。
四、递归和回调函数
- 递归:
def sleep(a):
if a == 5:
return 1
print('睡了+%s'%a)
return sleep(a+1)+a
print(sleep(0)) # 输出结果为11 :0+1+2+3+4+1 和 第一个print()的内容。
- 阶乘:把上例子的return中的 +a 变为*a,即可实现阶乘
return sleep(a+1)*a
print(sleep(1)) # 输出的数值结果变为24:1*2*3*4*1
递归的关键点:是通过返回函数调用来实现的,注意要加判断条件终止函数调用,否则就是死循环。
- 回调:
回调函数本身是一个函数,只是被传入另一个函数当中,供其调用。回调函数不一定会被调用,是否调用由被传入函数的内部逻辑决定。
def fun_a():
print('回调函数,快来调用我')
def fun_b(fun):
fun() # 之前可加判断条件,来实现是否启用回调函数。
print('我自己的功能')
fun_b(fun_a)