B站闭包函数move小游戏拆解
大家好,我又来拆解代码了。我发现拆解代码是一件很有意思的事,虽然会严重拖慢学习的进程,但是在这个过程中我可以加深已经学过的知识的理解和掌握,解决现存问题,也蛮有乐趣和成就感的。废话少说,以下是我对46讲闭包函数的理解以及拆解过程,有不妥的地方还请各位大佬多多指教。move小游戏拆解
序号代码拆解和思路
1origin = (0, 0) #这个是原点这三行代码就不解释了,大家应该都明白是什么意思
2legal_x = [-100, 100] #限定X轴的移动范围
3legal_y = [-100, 100] #限定Y轴的移动范围
4def creat(pos_x=0, pos_y=0):第一层函数
5 def moving(direction, step):第二层函数
6 nonlocal pos_x, pos_ynonlocal语句改变pos_x, pos_y的作用域,使其可以作用于整个嵌套函数
7 new_x = pos_x + direction*step对new_x和new_y进行赋值。(我在这里被卡了一下,因为不知道为啥在direction没有被赋值的情况下就可以直接进行索引了。发帖求助得到的答案是,在moving函数里,direction是一个形式参数,已经被赋值了)
8 new_y = pos_y + direction*step
9
10 if new_x < legal_x:if语句设定new_x超出其“最小”移动范围时,pos_x的值
11 pos_x = legal_x - (new_x - legal_x)
12 elif new_x > legal_x:嵌入elif语句设定new_x超出其“最大”移动范围时,pos_x的值(这里能不能用“嵌入”不是很确定)
13 pos_x = legal_x - (new_x - legal_x)
14 else:嵌入else语句设定new_x在规定的移动范围时,pos_x的值(这里能不能用“嵌入”不是很确定)
15 pos_x = new_x
16
17 if new_y < legal_y:把10-15行拆解里的x替换成y即可
18 pos_y = legal_y - (new_y - legal_y)
19 elif new_y > legal_y:
20 pos_y = legal_y - (new_y - legal_y)
21 else:
22 pos_y = new_y
23
24 return pos_x, pos_y生成pos_x, pos_y
25 return moving生成moving函数的结果
26
27move = creat()对move进行赋值(我这里不明白为什么把creat()赋值给move。思考的结果是为了看起来好看,用起来方便,这也符合Python的极简原则)。
28move()1、小甲鱼直接用了move(, 20),里面是列表和数字,我在想如果是空的会是什么结果,于是就试了一下,然后就报错了,原因是“方向”和“步数”参数没有。
2、我这里其实还有一个推测,当然小甲鱼也可能讲过,那就是creat()的默认是creat(0, 0),如果不对的话还请大家指正。
29Traceback (most recent call last):
30File "<pyshell#6>", line 1, in <module>
31 move()
32TypeError: creat.<locals>.moving() missing 2 required positional arguments: 'direction' and 'step'
33move("85", 8)这里是模仿小甲鱼给了“3”个参数,我的想法是想看下这样行不行。如果行的话,那么direction的结果就应该是“8”, direction就应该是5.结果是报错,错误原因是整数和字符串不是“+”支持的参数,这里虽然不是很明白,但是觉得也没必要去深究,反正知道整数和字符串在这里不适用就行了,我其实还想试一下字符串来着,但是人家已经说了字符串不行,那就没必要了。
34Traceback (most recent call last):
35File "<pyshell#7>", line 1, in <module>
36 move("85", 8)
37File "<pyshell#4>", line 4, in moving
38 new_x = pos_x + direction*step
39TypeError: unsupported operand type(s) for +: 'int' and 'str'
40move((8, 5), 8)整数和字符串不行,那么元组行不行呢?试一下,可以。
41(64, 40)
42creat((8, 5), 8)那么creat((8, 5), 8),也就是crea函数里放一个元组行不行呢?试一下,不行、、、、报错原因以前也见到过,但是还是不大懂,有些头疼,不深究了,下次碰到再说
43<function creat.<locals>.moving at 0x00000251980072E0>
44creat(8, 5, 8)那么给creat三个参数,也就是大家看到的creat(8, 5, 8)行不行呢?试一下,也不行。报错原因是creat只有两个参数,但是我这里给了3个,当然不行,嘿嘿嘿嘿
45Traceback (most recent call last):
46File "<pyshell#10>", line 1, in <module>
47 creat(8, 5, 8)
48TypeError: creat() takes from 0 to 2 positional arguments but 3 were given
49creat()(, 8)那么我不把creat函数赋值给别的“变量”或者说“函数”,直接多加一个()可不可以呢?试一下,可以。但是这样操作有点麻烦了,后面使用起来不方便,不符合Python的极简原则,这应该就是小甲鱼在开始举例的时候就把creat函数赋值给move的原因。
50(64, 40)
51总结:
学到第46讲,已经学了一半多,也是第一次碰到这么长的代码,很慎重,于是在这里停了差不多4天,目的是把这里面的每一个点都吃透。现在自评的话,明白了80-90%的样子。虽然还有一些点不是很透,但是我觉得问题不大,可以继续向前了。
先是nonlocal语句,然后是direction这个形式参数,再然后就是不大明白为啥要把creat函数赋值给move。前面两个问题想了半天不是很明白,然后发帖求助,把问题解决了,感谢各位大佬的回复。最后一个问题是自己想通的,给自己点个赞。
最后就是表扬一下小甲鱼的AI小助理,它是很有用的,基本上都是秒回。虽然答案有时候不是很令人满意,但是对于个人学习而言,综合体验已经超过了身边绝大部分的朋友。因为即便是朋友和老师也不能做到秒回且给到你有用的参考答案且一次又一次耐心的回复。
PS,格式栏里的那个小扫把,我还以为是个格式刷,也确实是格式刷,但是是用来清除格式的{:10_266:}
页:
[1]