|
发表于 2018-7-18 11:27:21
|
显示全部楼层
本帖最后由 王达沛 于 2018-7-18 11:31 编辑
在看了小甲鱼的《零基础入门学习Python》的闭包函数后进了帖子观摩,
书本上的网址完全是错的,所以直接百度官网后注册搜索,才能进来,
估计是防止某些人恶意破坏,注册新账号后禁止发帖半个小时,,,
这代码本来我也看不懂,后来复制到Python3.65后,结合运行结果大概看明白了
先看 move = create() ,后面的调用方式是 move( 【1,0】,10 )
等价于 create()( 【1,0】,10 ) , create() 函数有默认形参,所以相当于
create( pos_x = 0 ,pos_y = 0)( direction = [ 1, 0] , step = 10 )
第一个括号为 原点(0,0),第二个括号 为闭包:内部函数 moving( direction = [ 1, 0] , step = 10 )
的调用,在函数 moving() 中 ,声明了 nonlocal pos_x, pos_y , 表明 pos_x, pos_y 属于
外部作用域:create() 中,即调用其原点位置。
在闭包中对全局变量 (列表list 类型 ) legal_x , legal_y 进行访问(没有进行修改哦),假如
移动后的新坐标 (x,y): new_x,new_y 超出了规定的范围 legal_x , legal_y 则多出部分往反方向
移动, 即 最大的 x 坐标 为 100,当向右移动 300 时, 最终停留位置: pos_x = 100 - (300 - 100)= -100
超出的 200 ,变成向左移动 200,(如果超过300小甲鱼这个程序的结果就溢出规定范围了哦!)
list列表变量 direction 的含义是 : direction【0】 左右移动(0 左,1 右),direction【1】 上下移动
(0 下,1 上),返回值为终点: pos_x, pos_y 自动打包为元组的 (pos_x, pos_y)形式返回
所以 move( [0, 1], 400 ) = create( pos_x = 0 ,pos_y = 0)( direction = [ 0, 1] , step = 400 )
意思为 从原点 ( pos_x = 0 ,pos_y = 0)向上移动( 因为 direction【1】 = 1)400(step 移动步幅)
以上就是我个人的浅见了,初学请包容,谢谢 |
|