编程语言
首页 > 编程语言> > 今日份 python(部分函数+递归)

今日份 python(部分函数+递归)

作者:互联网

函数部分了解了内嵌函数、闭包和lambda表达式。
上次说到全局变量和局部变量,在函数内部尽量避免去改变全局变量的值,这样会降低代码的可读性,一般当你在函数里改变全局变量的值时,系统会默认创建一个名字与全局变量相同的局部变量去赋值,而原本的局部变量值不会改变。但是也不是说在内部函数里改变不了全局变量的值,如果你真的需要修改,则可以通过 global关键字 去修改,去声明你要改变这个全局变量而不是去默认创建局部变量。

global 全局变量
全局变量 = 赋值

闭包,简单理解为 函数1里面还有一个函数2 且函数2里用到了函数1里的变量,这时 函数2就叫做函数1的闭包。
在这里插入图片描述
函数fun2就是函数fun1的闭包,x相当于fun2的外部变量,这里fun2里面是不能改变x的值的(类似全局变量)
在这里插入图片描述

如果想在闭包里改变外部函数变量的值,就需要用到 nonlocal关键字。
在这里插入图片描述
接下来 lambda 表达式,是一种匿名函数创建方式,利用lambda 表达式可以省下定义函数的过程,也不用去想函数名等等。

lambda 变量 : 函数式(返回值)

在这里插入图片描述
这样可以就不用去定义那些简单的函数,直接用lambda会使代码更加简洁。

其次 学习了两个重要的BIF。
0.filter(函数 or None,迭代对象) (可以有两个参数) 这个BIF的功能简单讲就是帮你找到 1 的对象,有过滤功能。

在这里插入图片描述

可能看到这里,觉得这个BIF的功能没啥用,不过当这个BIF与上面的 lambda表达式结合,就会使代码变的简单起来。
在这里插入图片描述
利用一句话就能找到1到9的奇数并合成为列表使用,这样是不是就能让整个代码简洁了很大。
1.map() 2个参数,这个BIF 是映射的意思,直接举例子
在这里插入图片描述
这里就是把迭代对象里的元素,依次带入函数中求出结果。
这两个BIF都是比较常用的,配合lambda表达式 会有意想不到的东西。
其次,今天着重看了 递归,个人觉得递归可以说好理解,但不好弄懂。关于递归,看了两个例子。第一个就是 著名的斐波那契数列,比较简单,这里既可以使用迭代也可以利用递归。
在这里插入图片描述
在这里插入图片描述
上面是两种方法的代码,可以看出递归代码篇幅明显更短,更简洁。但是这里不建议使用递归去实现,因为递归是用内存的代价去换来简便的代码,当你去输入一个很大的数的时候,就会明显感受到递归的速度、效率明显低于迭代的。
而什么时候去使用递归呢?这里举第二个例子 著名的汉诺塔游戏,如果这里去使用迭代的话,一般人还真写不出来,但利用递归将会使这个难题变的简单起来。
在这里插入图片描述
上面的代码输入盘子的层数就能得到一个怎么移动盘子的攻略。代码非常的简短,但却解决了一个很复杂的问题,这里就不得谈谈 递归思想——分治思想,简单说就是把一个复杂很难的问题,分成几个小问题,若小问题还是很复杂,则将小问题继续分解下去,直到一个个简单举手间就能解决的小问题,只要把小问题解决了,这样就能往回走就相当于把这个大难题解决。递归就差不多就是这个意思,但递归虽好,也不要去轻易使用,不然代码效率会大大折扣,这也就是为什么说 ‘普通程序员,用迭代;天才程序员,用递归。’
——————————垃圾分界线——————————————
消失了一周,我又回来了。上一周自从考完物理,就又要搞物理实验报告又要准备下次的物理预习实验,还有Java的课程设计等等,反正就是鸡毛蒜皮生活琐事也是一大堆,搞的自己很难静下心去学习一个新东西,每天跑去看什么课外书或者纪录片(这里推荐《平凡的世界》、《国家宝藏》挺好看的 ) 以后的时间会比较充裕,很多课都准备结课了,就 离散 比较需要花时间去复兴,希望自己多多加油!不要懈怠呀!别天天发呆了。。。。。

标签:函数,递归,python,代码,BIF,全局变量,lambda
来源: https://blog.csdn.net/weixin_45666838/article/details/111078311