1.嵌套函数
name = "nis"
def change():
name = "nis,learn python"
def change2():
# global name
name = "nis,cool"
print("打印第二层",name)
change2()
print("第二层打印",name)
change()
print("最外层",name)
输出
打印第二层 nis,cool
第二层打印 nis,learn python
最外层 nis
#每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。
2. 匿名函数
不显示指定的函数名
def calc(x,y):
return x**y
print(calc(3,5))
calc= lambda x,y:x**y
print(calc(3,5))
搭配其他函数
res = map(lambda x:x**2,[1,3,7,3,6])
for i in res:
print(i)
3.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def get_abs(n):
if n < 0:
n = int(str(n).strip("-"))
return n
def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,get_abs)
print(res)
高阶函数条件:
接受一个或多个函数作为输入
return 返回另外一个函数
4.闭包
函数定义和函数表达式位于另一个函数整体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量,函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说内部函数会再外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量,参数以及其他内部函数,这些局部变量,参数和函数声明(最初时)的值是外部函数返回时的值,但也会收到内部函数的影响
def outer():
name = 'alex'
def inner():
print("在inner里打印外层函数的变量",name)
return inner # 注意这里只是返回inner的内存地址,并未执行
f = outer() # .inner at 0x1027621e0>
f() # 相当于执行的是inner()
注意此时outer已经执行完毕,正常情况下outer里的内存都已经释放了,但此时由于闭包的存在,我们却还可以调用inner,并且inner内部还调用了上一层outer里的name变量。这种黏黏糊糊的现象就是闭包。
闭包意义
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处条用,优先使用自己外层函数包裹的作用域