内容正文:
4.1.4Python的函数
第四单元 程序设计基础
函数
python函数大致分为三种:
1、系统内置函数(BIF),如range( ),type( )
2、标准库函数,如导入math模块,就可以使用该模块下的函数
3、使用def自定义的函数
使用函数的优点:
可以实现模块化,便于日后的调试,为操作提供了接口
第四单元 程序设计基础
函数基础
1、自定义函数
def 函数名称(参数列表):
函数体
return 值
说明:
def是关键字,用来定义函数的开头,行尾有冒号
函数名称要遵循命名规则
参数列表为形式参数,用来接收值,可以有多个,也可以省略参数
函数体必须缩排,可以是单行或多行语句
return用来返回值,若无值返回,return行可省略
第四单元 程序设计基础
函数基础
2、调用自定义函数
定义好的函数,在程序代码里直接调用函数名称即可,如果函数有参数必须带入参数值,经由函数的执行返回值
3、自定义函数的返回值
自定义函数是否有返回值,可分以下情况讨论
自定义函数没有参数,函数体也没有运算表达式,以print( )输出信息即可
第四单元 程序设计基础
函数基础
自定义函数有参数,函数体也有运算,就得以return语句返回结果(新建一程序,编辑,保存,运行观察)
如果函数值有多个,return语句就可以配合元组对象来返回(新建一程序,编辑,保存,运行观察)
第四单元 程序设计基础
函数参数的基本机制
使用函数时,可进行不同参数的传递和接收,先了解两个名词:
实际参数—在程序中调用函数时,将接收到的数据或对象传递给自定义函数,默认为位置参数
形式参数—定义函数时,用来接收实际参数所传递的数据,进入函数主体执行语句或运算,默认以位置参数为主
参数在函数中所扮演的角色不 ,定义函数、调用函数时,形式参数、实际参数除了以位置为主之外,还有什么使用
默认参数值:让自定义函数的形式参数采用默认值方式,当实际参数未传递时,以 默认参数=值 进行接收
关键字参数:调用函数时,实际参数直接以形式参数为名称,配合设置值传递数据
使用*和**表达式。配合形式参数,*表达式以元组组成,**表达式以字典相辅,它们可以收集实际参数。通过实际参数,*运算符可拆分可迭代对象,**能拆分映射对象,让形式参数接收。
第四单元 程序设计基础
函数参数的基本机制
Python如何传递参数:
不可变对象(数值,字符串等),使用对象引用时先复制一份再传递,即传值
可变对象(列表),使用对象时直接传递地址
第四单元 程序设计基础
函数参数的基本机制
在参数传递时,可变和不可变对象若被修改,函数passFun的name被修改时,不会影响外部的na;而passFun的score会保留所有的修改,同时也会影响外部的sc列表
第四单元 程序设计基础
位置参数的有序性
对于python程序而言,参数传递机制以位置参数为主,当自定义函数声明了3个参数时,调用函数也必须传递三个参数,缺一不可,其具有顺序性,不可乱序。
第四单元 程序设计基础
默认参数值
默认参数值是指自定义函数时,将形式参数给予默认值,当调用函数某个参数没有传递数据时,自定义函数可以使用其默认值,其语法如下:
def 函数名(参数1,默认参数2=值,……):
函数体
形式参数的第一个必须是位置参数
形式参数的第二个才是默认参数,并且同时要设置值
使用默认参数能让实际参数传递时更具弹性,但要遵循以下规则
若有位置参数,则必须放在默认参数前
默认参数值对于可变和不可变对象有不同的执行效果
第四单元 程序设计基础
默认参数值
如果每次执行时,希望列表都是空的,可新建如下程序,运行看看:
第四单元 程序设计基础
关键字参数
调用函数时不想按序进行一对一的参数传递时,关键字参数就能派上用场了。它会直接以定义函数的形式参数为名称,不需要按其位置来给参数赋值。
第四单元 程序设计基础
可长可短的参数行
定义函数的形式参数和调用函数的实际参数以主,才能按序对应。为了让形式参数和实际参数更灵活应用,可前缀*和**字符来搭配使用。定义函数时,以运算表达式来呈现,*和元组来使用,**与字典配合,收集多余的实际参数。调用函数时,针对实际参数,*拆分可迭代对象,**以映射对象为拆分对象。
1、形式参数的*表达式
def 函数名(参数1,参数2……参数N,*tp):
函数体
注:*tp 配合元组对象来收集额外的实际参数
第四单元 程序设计基础
可长可短的参数行
第四单元 程序设计基础
可长可短的参数行
第四单元 程序设计基础
可长可短的参数行
2、**表达式与字典配合
def 函数名(**dict):
函数体
单一形式参数,使用**表达式,配合空的字典对象接收关键字参数
调用函数时,关键字参数会以 实际参数=值 来传递
第四单元 程序设计基础
可长可短的参数行
**表达式之前也可加入位置参数
def 函数名(参数1,参数2……,参数N,**dict):
函数体
位置参数必须放在字典对象之前
接收的关键字参数都会放入到字典对象之前
第四单元 程序设计基础
可长可短的参数行
3、*表达式和**表达式双管齐下
def 函数名(*tp,**dict):
函数体
*表达式用于收集位置参数,**表达式用于收集关键字参数
自定义函数据的形式参数若是位置参数,则必须放在*和**表达式之前
第四单元 程序设计基础
可长可短的参数行
4、*运算符拆分可迭代对象
调用函数时,实际参数传递数据时同样可使用*运算符来拆分可迭代对象
第四单元 程序设计基础
可长可短的参数行
5、**运算符拆分字典对象
拆分字典项目时,键值要作为形式参数的名称,用它来接收字典对象的值
第四单元 程序设计基础
更多函数据的讨论
无论是变量还是函数,对于python而言都有作用域。根据作用域可创建四种函数:全局函数,局部函数、lambda函数和方法。
1、作用域
通常内置作用域,最大的是命名空间,其次是全局作用域,最小的局部作用域,程序代码中一般也有全局变量、局部变量和内置作用域,如:
第四单元 程序设计基础
更多函数据的讨论
给变量赋值后,执行程序时如何知道变量的作用域?通常由内而外,由小到大,先从最小的作用域找起,接着全局作用域,最后才是内置作用域。
全局变量,任何位置都可以调用它,局部变量,离开它的作用区域,就结束生命周期。
局部变量与全局变量同名时,易引发错误
第四单元 程序设计基础
更多函数据的讨论
2、lambda函数
又称lambda表达式,它没有函数名称,只会以一行语句来表达其语句,语法如下:
lambda 参数列表,……:表达式
参数列表使用逗号隔开,表达式之前的冒号不能省略
lambda函数只会有一行语句
表达式不能用return语句
由上例可以看出,自定义函数calc与lambda函数功能相当
第四单元 程序设计基础
更多函数据的讨论
新建一程序,保存,运行
说明:创建一个含有元组的列表,使用lambda函数将字段以data变量来表达,指定第一个字段data[0]为排序的依据
第四单元 程序设计基础
更多函数据的讨论
3、filter函数
语法如下:
filter(func,iterable)
func表示要定义一个函数或lambda函数
表示迭代器的可迭代元素
先定义一个函数getnums,返回大于2的数,使用filter函数,由于它以迭代器返回结果,所以必须用list函数转换为列表对象,才能显示结果。
第四单元 程序设计基础
更多函数据的讨论
3、递归
就是函数自己调用自己。
递归时一般有两种情况,函数主体用if/else判断
1、基本情况:用来终止递归的调用,又称为递归边界
2、递归情况:调用自己,进行递归
上面的程序,右边采用的就是递归写法
第四单元 程序设计基础
下节课再见
$$