您的位置:首页 > 编程语言 > Python开发

【学习笔记】用python的非闭包、闭包(函数式编程)、面向对象方法解决旅行者问题

2018-01-08 21:45 691 查看
三种方法实地累计旅行者所走路径长度,origin=0 为起点,编写一个函数,不断调用这个函数可以得到与初始位置的距离result,每次调用函数传入的参数为该次旅行所走距离step。例如,一开始x = 0,走了距离3,step = 3,result = 3,再走距离5,step= 5,result = 8。难点在于每调用完一次函数就要存储一次结果,与下次走的距离进行累加

方法一:非闭包

假设第一次走了距离2、第二次走了距离3、第三次走了距离6,那么按照要求,每次调用函数的结果应分别为2、5、11

尝试编写函数如下:



报错了,原因是origin变量在引用之前还没有被赋值,即局部变量origin在函数内部还没有被定义



当我们把第5行代码注释掉,再运行



就不会报错了,因为这时origin变量沿着变量作用域链向上层寻找到了全局变量origin=0但是函数也不符合题目要求了



原因在于origin= new_pos ,python认为在函数内部,当赋值号左边的变量等于某个值的时候,那么这个变量就是函数内部的局部变量,就不会到外层寻找全局变量origin了

此时可以在函数内部将origin声明为全局变量



打印结果正确



方法二:闭包(函数式编程)



这个地方碰到了和上一个方法同样的问题,就是局部变量未赋值就引用了



这时候可以将 pos 变量声明为nonlocal,nonlocal可以让变量的作用域覆盖到上一层,而不是覆盖到全局,这是它和global关键字不一样的地方





运行正确,此时origin并没有被改变,所有执行过程都局限在函数内部,保证了函数的自封闭性

方法三:面向对象方法

与函数式编程不一样,比较简单方便的方法,使用类变量统计对象个数即可:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: