defsquare(x):return x**2defpow_2(fun):# pow_2就是高阶函数,两个条件都满足return fun
f = pow_2(square)print(f(8))print(f == square)
64
True
第三部分 嵌套函数
在函数内部定义一个函数
defouter():print("outer is running")definner():print("inner is running")
inner()
outer()
outer is running
inner is running
第四部分 闭包
4.1 闭包的定义
defouter():
x =1
z =10definner():
y = x+100return y, z
return inner
f = outer()# 实际上f包含了inner函数本身+outer函数的环境print(f)print(f.__closure__)# __closure__属性中包含了来自外部函数的信息for i in f.__closure__:print(i.cell_contents)
res = f()print(res)
<function outer.<locals>.inner at 0x000001BE11B1D730>
(<cell at 0x000001BE0FDE06D8: int object at 0x00007FF910D59340>, <cell at 0x000001BE0FDE0A98: int object at 0x00007FF910D59460>)
1
10
(101, 10)
延伸了作用域的函数
如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包
闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)
4.2 nonlocal——声明范围
一旦在内层函数重新定义了相同名字的变量,则变量成为局部变量
defouter():
x =1definner():
x = x+100return x
return inner
f = outer()
f()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-87-d2da1048af8b> in <module>
10
11 f = outer()
---> 12 f()
<ipython-input-87-d2da1048af8b> in inner()
3
4 def inner():
----> 5 x = x+100
6 return x
7
UnboundLocalError: local variable 'x' referenced before assignment
用nonlocal x 这个语句声明 x 引用的范围(跳过本层的引用),也就在后面执行 x = x+100 这一语句时,第二个 x 不再引用第一个 x,跳过了本层的引用,引用了上一层的 x = 200,再把这个 x 赋给本层定义的 x
defouter():
x =1definner():nonlocal x
x = x+100return x
return inner
f = outer()print(f())