函数
这里所的 函数 并不是我们接触的数学上的函数
函数是最基本的一种代码抽象的方式,是组织好的可重复使用的,用来实现单一或相关联功能的代码段。
函数是对做相似的事情或相似的动作进行封装,它能提高应用的模块性和代码的重复利用率。我们要封装好一个函数,首先要学会对事务进行抽象,抽象是数学中非常常见的概念。
举个例子:
计算阶乘,比如:1 *2 * 3 * … * 10,写起来十分不方便,我们为了简便可以写成10!。再如求和公式 [公式] 等同于1 + 2 + 3 + … + 100;
抽象非常强大,借助抽象,我们不用关心底层的具体计算过程,而直接在更高的层次上思考问题。
写计算机程序也是一样,函数就是最基本的一种代码抽象的方式。
Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用,如 print() 能输出任何对象,len()能计算不同类型对象的长
一、函数命名规则
函数是一个变量,所以它的命名规则与变量相同:
1、变量名称只能由(大小写字母、数字、_)有效符号组成
2、不要使用数字开头!!!
3、不要使用关键字或者保留字!!!
4、变量命名尽量有意义
5、推荐使用下划线命名法
二、函数的定义
def 函数名称 (参数):
函数内容
返回值(可以没有)
三、函数的分类
1.有无返回值
返回值 即return
分为:
有返回值函数:
①:使用return关键字返回结果
②:函数遇到return,立即返回
无返回值函数
2.有无参数
有参函数
①:参数个数,根据情况任意
②:参数类型,是任意的类型
无参函数
3.函数定义者
系统函数:
由官方定义的函数:
如 input print type
第三方定义的函数:
需要安装模块,才能使用
pip install 模块名称(Linux需要先安装pip)
自定义函数:
也就是我们自己定义的函数(使用def)
四、函数调用
函数本质其实就是对象
调用就是先压栈 然后使用,走完整个函数流程之后,将函数出栈。
压栈(进栈):将函数放入栈中执行。
弹栈(出栈):函数执行完成后出栈。
五、引用传递和值传递
引用传递:本质是用一个地址,对象,引用。
值传递:本质就是用了这个值。
六、函数参数
默认值参数:
如果一个函数的参数,在大多数情况下,值是固定的一个值,此时可以使用默认值参数
这个时候,如果不传该参数,值就取默认的,如果传递了,则按照传递的算。
注意:默认值参数,一定要写在普通参数之后
可变参数:
在python,如果一个函数中参数可能有很多(这些参数,也可以没有),建议将这种参数设置为可变参数
参数名称(习惯性args)
注意:可变参数默认是以元组封装所有参数
命名(关键字)参数:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
七、递归
递归其实就是出入栈的过程,自己调用自己。
这样看来虽然是无限循环了,可可以在函数中写入一个判断语句,让其在该停止的地方使用return 停止下来
就像查词典一样,不会一个词,查第一个,查完第一个里还有不会的词,查二个······以此类推。(直到有一个全会,再收回来)
用以下题目来解析递归,可以用递归,也可以用普通的循环
#有一对兔子,从出生后的第3个月起,每个月都生一对兔子,
小兔子长到第3个月后每个月又生一对兔子,
假如兔子不死,问第n个月的兔子对数为多少?
分析得,第三项开始是Sn+2=Sn+1+Sn
n = int(input(“请输入月份:”))
def rab():
a = 1
b = 1
c = 0
if n >=3:
for i in range(2,n):
c = a + b
a = b
b = c
return c
else:
return 1
print(“第”,n,“个月有”,rab(),“对兔子”)
#递归
def rabit(n):
if n == 1 or n == 2:
return 1
return rabit(n-1)+rabit(n-2)