【学习笔记】用python的非闭包、闭包(函数式编程)、面向对象方法解决旅行者问题
2018-01-08 21:45
691 查看
三种方法实地累计旅行者所走路径长度,origin=0 为起点,编写一个函数,不断调用这个函数可以得到与初始位置的距离result,每次调用函数传入的参数为该次旅行所走距离step。例如,一开始x = 0,走了距离3,step = 3,result = 3,再走距离5,step= 5,result = 8。难点在于每调用完一次函数就要存储一次结果,与下次走的距离进行累加
尝试编写函数如下:
报错了,原因是origin变量在引用之前还没有被赋值,即局部变量origin在函数内部还没有被定义
当我们把第5行代码注释掉,再运行
就不会报错了,因为这时origin变量沿着变量作用域链向上层寻找到了全局变量origin=0但是函数也不符合题目要求了
原因在于origin= new_pos ,python认为在函数内部,当赋值号左边的变量等于某个值的时候,那么这个变量就是函数内部的局部变量,就不会到外层寻找全局变量origin了
此时可以在函数内部将origin声明为全局变量
打印结果正确
这个地方碰到了和上一个方法同样的问题,就是局部变量未赋值就引用了
这时候可以将 pos 变量声明为nonlocal,nonlocal可以让变量的作用域覆盖到上一层,而不是覆盖到全局,这是它和global关键字不一样的地方
运行正确,此时origin并没有被改变,所有执行过程都局限在函数内部,保证了函数的自封闭性
方法一:非闭包
假设第一次走了距离2、第二次走了距离3、第三次走了距离6,那么按照要求,每次调用函数的结果应分别为2、5、11尝试编写函数如下:
报错了,原因是origin变量在引用之前还没有被赋值,即局部变量origin在函数内部还没有被定义
当我们把第5行代码注释掉,再运行
就不会报错了,因为这时origin变量沿着变量作用域链向上层寻找到了全局变量origin=0但是函数也不符合题目要求了
原因在于origin= new_pos ,python认为在函数内部,当赋值号左边的变量等于某个值的时候,那么这个变量就是函数内部的局部变量,就不会到外层寻找全局变量origin了
此时可以在函数内部将origin声明为全局变量
打印结果正确
方法二:闭包(函数式编程)
这个地方碰到了和上一个方法同样的问题,就是局部变量未赋值就引用了
这时候可以将 pos 变量声明为nonlocal,nonlocal可以让变量的作用域覆盖到上一层,而不是覆盖到全局,这是它和global关键字不一样的地方
运行正确,此时origin并没有被改变,所有执行过程都局限在函数内部,保证了函数的自封闭性
方法三:面向对象方法
与函数式编程不一样,比较简单方便的方法,使用类变量统计对象个数即可:相关文章推荐
- 【Python学习笔记】函数式编程:高阶函数
- 【Python学习笔记】函数式编程:高阶函数sorted
- Python学习笔记2:函数式编程
- Python进阶笔记(2)_ 函数式编程 之 闭包和装饰器decorator
- python学习笔记——5_解决问题编写脚本
- 【极客学院】-python学习笔记-3-单线程爬虫 (request安装遇到问题及解决,应用requests提取信息)
- python数据结构学习笔记-2017-01-08-01-N皇后问题、迷宫问题和跳马问题的递归解决
- Python学习笔记,函数式编程,高阶函数
- 【Python学习笔记】函数式编程:装饰器
- Python学习笔记——函数式编程
- 【python学习笔记】函数式编程:返回函数
- Python学习笔记(二)--解决中文的问题
- Python学习笔记:学习爬虫时遇到的问题TypeError: cannot use a string pattern on a bytes-like object 与解决办法
- Python学习笔记11:Python函数和函数式编程
- python学习笔记(四) - 函数式编程
- 【Python学习笔记】函数式编程:高阶函数filter
- Python学习笔记07_函数式编程
- python 学习笔记---函数式编程之高阶函数
- 【Python学习笔记】函数式编程:匿名函数lambda
- 【Python学习笔记】函数式编程