接上文,Python中函数入门,有关内置函数及定义。
今天,我们一起看看函数的调用。
四、函数调用(Function invoke)
函数必须先定义再调用,可以一次定义多次使用。切不可先写调用后写
1、调用格式
1接收变量 = 函数名(实参值列表…)
如果有位置参数,则必须传入实参必;
如果有返回值,可以接收,也可以不接收,看你是否需要这个值,一般我们对有返回值的都接收。但是接收了没有返回值的函数,则值为None;唯一的NoneType类型的实例。
如:两个函数定义
1
调用如下:
1
2、调用顺序
调用之前确保函数已经定义了,函数一旦定义了,就可以被多次调用,还可以导入其他模块使用。调用的顺序与定义的顺序无关。代码执行是从上往下的执行。
1
3、执行顺序
函数需要先定义再使用,函数被调用时,进去函数执行,函数执行结束或者遇到return执行结束,将返回值返回,同时交出执行权给调用处。叶落归根。
1
4、实参能被函数修改吗?
有一个列表,能否利用自定义的函数对其直接修改?
有一个字典,能否利用自定义的函数对其删除某个键值对?
1
执行结果:
1函数执行前: [
那若是实参是不可变类型能通过函数修改内容吗?
哈哈,这个问题其实蠢爆了,不可变类型肯定没法修改内容,我们只能修改对应变量的指向,与修改内容完全无关。
5、嵌套调用
嵌套调用就是类似数学里的综合式,比如下面的这种:
1t =
我们可以直接这样写:
1t =
试想一下,我们现在的生活的衣食住行,是否都是自己自给自足的,显然分出出现以后我们大部分要依赖外界提供对吧,那么若是我么你的生活就是一个函数,那么衣食住行我们就把功能外包给其他人,想吃饭调用一下餐馆的就餐功能或者函数,所以我们的生活处处都是函数的嵌套,我们都是站在巨人的肩膀上,要记住,我们要站在巨人的肩膀上,而不是什么都从头造,否则很难从石器时代走出来。
我们现在有一个主逻辑是实现登录操作,用户名与密码正确进入系统,错误拒绝登录,但是还有一个判断逻辑,就是用户名和密码不能为空功能,我们要让函数做分工,一个函数登录,一个函数校验输入内容。
1
6、递归
引用或者调用自身的函数称为递归函数。递归结构包括两个部分:
递归头:函数执行的最小可能性问题,也就是什么时候结束引用自身;
递归体:引用自身。
/# 使用递归 实现阶乘
1
1
二分法查找(binary search),又叫折半查找。就我我们过去的猜数字游戏,在[0,100]之间,才生成的随机整数,我们首先会猜50,减少一般的可能性,若是此时大了,我们猜75,又减少了一般的可能性,一步一步缩小范围,最多经过7次就可以定位这个值。LogN以2为底,log2(N)不大于7。我们分析一下如何用递归实现:
递归头:如果上下限相同,那么就是数字位置所在
递归体:找到区间的中间点,查找数字在左侧还是右侧,继续查找所在那半部分
注意:二分法查找只能在有序的序列中使用。
1
递归会占用大量的堆栈保存现场,内存消耗极大,层次多较慢,慎重使用,但是递归的思想极好,不单单可以用来编程,管理的思路也是如此。