Python学习16--闭包函数

#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步#紫色字体也体现出闭包函数每次修改参数的值,可以往下传递的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘟嘟love佳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值