#Author:Du Yang
#Data:2018/7/21
def outer(x):
def inner(y):
nonlocal x #通过该语句声明,此处引用为上一作用域中的变量;
#否则不能直接修改或使用改变量,但可以通过间接改变局部值来改变整体的值
x +=y
return x
return inner
a = outer(10)
print(a(1))
print(a(3))
#总结: 闭包函数
# 构成:1.外部函数+内部函数 2.内部函数必须存在调用外部函数局部变量的成分 3.外部函数返回值必须是内部函数的函数名
# 闭包函数在调用过程中,如果对闭包变量进行修改,则在下一次调用该函数时,仍会继续使用更改之后的闭包变量
*****************************关于声明局部变量对其引用的再次说明**********************************
通过如下实验例子说明:
用途1:当闭包执行完后,仍然能够保持住当前的运行环境。 # 比如说,如果你希望函数的每次执行结果,都是基于这个函数上次的运行结果。我以一个类似棋盘游戏的例子来说明。假设棋盘大小为50*50,左上角为坐标系原点(0,0),我需要一个函数,接收2个参数,分别为方向 (direction),步长(step),该函数控制棋子的运动。棋子运动的新的坐标除了依赖于方向和步长以外,当然还要根据原来所处的坐标点,用闭包就可以保持住这个棋子原来所处的坐标。
origin = [0, 0] # 坐标系统原点 legal_x = [0, 50] # x轴方向的合法坐标 legal_y = [0, 50] # y轴方向的合法坐标 def create(pos=origin): def player(direction,step): # 这里应该首先判断参数direction,step的合法性,比如direction不能斜着走,step不能为负等 # 然后还要对新生成的x,y坐标的合法性进行判断处理,这里主要是想介绍闭包,就不详细写了。 new_x = pos[0] + direction[0]*step new_y = pos[1] + direction[1]*step pos[0] = new_x pos[1] = new_y #标红处即为通过修改变量内部元素值,最终达到对整体变量修改的目的 #注意!此处未添加nonlocal不能写成 pos = [new_x, new_y],原因在上文有说过 return pos return player player = create() # 创建棋子player,起点为原点 print (player([1,0],10)) # 向x轴正方向移动10步 print (player([0,1],20)) # 向y轴正方向移动20步 print (player([-1,0],10)) # 向x轴负方向移动10步#紫色字体也体现出闭包函数每次修改参数的值,可以往下传递的功能