目录
一、函数的参数定义
1、参数默认值
2、个数可变的位置参数
3、个数可变的关键字形参
4、函数参数的总结
(1)函数的调用
(2)函数的定义
二、变量的作用域
三、递归函数
1、递归函数的一些概念
2、练习:计算阶乘
四、斐波那契数列
1、什么是斐波那契数列
2、练习:输出斐波那契数列(前6个)
第九章总结
一、函数的参数定义
这里的参数定义指的是函数形参的定义方式。
1、参数默认值
函数定义时,将形参设置默认值,只有与默认值不符的时候才需要传递实参。
通过上图我们可以看到,第七行调用函数的时候,将100付给了a,然后b是默认值的10;第八行调用函数的时候,将23给了a,b的默认值被改变成了10.
2、个数可变的位置参数
定义函数时,可能无法事先确定传递的参数位置实参的个数时,使用可变的位置参数。使用*定义个数可变的位置形参。结果是一个元组。
当我不确定传递实参的位置时,用上图所示的传递方法。
3、个数可变的关键字形参
定义函数时,可能无法事先确定传递的关键字实参的个数时,使用可变的关键字形参。使用**定义个数可变的关键字形参。结果是一个字典。
当我不确定关键字参数的个数时,用上图所示的传递方法。
注意:
函数里面个数可变的可变的位置参数只能设置一个;个数可变的关键字参数也只能设置一个;当函数中既要用到个数可变的位置参数也要用到个数可变的关键字参数时,个数可变的位置形参要放在个数可变的关键字形参之前。
4、函数参数的总结
(1)函数的调用
A.位置传参
将列表转为关键字参数时使用*
B.关键字传参
将字典转为关键字参数时使用**
(2)函数的定义
下图分别使用了默认值形参、个数可变的位置形参和个数可变的关键字形参
还可以这样定义,分别使用了位置实参传递、关键字实参传递以及两种方法结合的方法传递实参:
假设我现在有个需求:要求c和d只能使用关键字实参传递。
应该用以下方法解决:
第31行我们能看见在ab和cd之间加了一个*,这样一来的话,*之后的参数都必须采用关键字实参传递的方法了,不然就会报错。
还可以按照以下方法进行函数的定义,注意顺序:
二、变量的作用域
变量的作用域指的是程序代码能访问该变量的区域。
根据变量的有效范围可分为:
如上图所示,d就是全局变量,它可以在函数中使用,但a,b,c就是局部变量,他不可以在函数外使用。
如果想将局部变量转换成全局变量的话,加个global就行了。如上图所示,加了global之后函数外面也可以使用age参数了。
三、递归函数
1、递归函数的一些概念
递归函数是:如果在一个函数的函数体内调用了该函数本身,这个函数就叫做递归函数。
递归的组成部分:递归的调用与递归的终止条件。
递归的调用过程:每递归调用一次函数,都会在栈内存分配一个栈帧。每执行完一次函数都会释放相应的空间。
递归的优点:思路和代码简单。
递归的缺点:占用内存多,效率低。
2、练习:计算阶乘
阶乘原理图如下:
我写的:
我写的比较复杂。。。而且没用嵌套。。。
老师写的:
四、斐波那契数列
1、什么是斐波那契数列
如上图所示,海螺为什么看起来非常美,是因为其中包含着黄金比例,而这个黄金比例就和斐波那契数列有关系。
如上图所示斐波那契数列指是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。。。。。这个数列从第3项开始,每一项都等于前两项之和。
2、练习:输出斐波那契数列(前6个)
定义函数:
调用函数:
代码的具体流程如下图:
第九章总结
见到递归函数也不要担心,记住使用if-else即可:什么条件下终止,否则调用。



