09 匿名函数、函数作用域、闭包、递归
语法规则:
lambda 参数:表达式
filter(lambdax: x>10, li)
匿名函数:可以赋给一个变量,重复使用。
fun1 = lambda x: x * 10 print(fun1(10)) 打印结果: 100 fun = (lambda x: x * 10)(5) print(fun) 打印结果: 50
函数作用域
01外部不能访问函数内部变量:
def fun1():
x = 1
print(x)
02函数内部能够访问函数外部变量:
x = 123
def fun2():
print(x)
03函数里面不能修改外部变量:
x = 123
def fun3():
x = x + 1
print(x)
04函数里面和函数外部变量名相同:
x = 123
print(x,id(x))
def fun1():
x = 456
return x,id(x)
a = fun1()
print(a)
函数内部:函数内部的变量,作用域只在函数内部,函数内部不可以直接更改函数外部的变量
global: 函数内部如果需要改变全局变量,就需要使用global修饰变量
实例:
x = 123 def fun1(): global x x +=1 return x b = fun1() print(b)
nonlocal: 在函数嵌套函数的情况下,同样也有函数作用域的问题,但是python3中提供了方便,只需要使用nonlocal就可以在里层函数内部修改外部函数变量。多层函数嵌套,nonlocal只修改上一层函数嵌套的值。
实例:
def fun2(): x = 123 def fun3(): nonlocal x x +=1 return x return fun3() a = fun2() print(a)
闭包
内嵌函数:
def fun1(): print('fun1()在被调用') def fun2(): print('fun2()在被调用') fun2() fun1()
闭包:
def func1(): print('外层函数') def func2(): print('内层函数') return 1 + 1 return func2() result = func1() print(result) 打印结果: 外层函数 内层函数 2
闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包
闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用
闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁
递归函数
递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件
递归实例:
def fun1(): print('金钱 == 爱情') return fun1() fun1()
阶乘:
def func(a): if a == 1: return a else: return func(a - 1) * a # result func(a - 1) + a 实现累加 result = func(5) print(result) 打印结果:120