黑马程序员学Python——函数

本文主讲:函数的定义与调用、lambda表达式等…..

了解函数

函数是什么:函数就是将一段可以独立执行的代码整合到一个整体,并命名,在需要这段代码的位置直接调用这个整体的名称即。

函数作用:所以函数在开发过程中,可以更高效的实现代码重用

image-20211009152945554

函数使用步骤

读前须知:函数在定义的时候,函数体下面的代码不执行,调用的时候才执行

第一步:定义函数

1
2
3
4
def 函数名(参数):
代码1
代码2
……….

第二步:调用函数

函数名(参数)

注意事项:

1:函数必须先定义在调用
2:函数名内的参数可有可无,论情况而定
3:调用函数时,解释器回到定义函数体下方的缩进代码执行,执行完毕后回到调用函数代码处
4:定义函数时,函数体下方缩进的代码不会被执行

函数的参数

读前须知:函数在定义的时候,函数体下面的代码不执行,调用的时候才执行

函数的参数

功能:让函数变得更加灵活,用户可以给出指定数据让函数进行数据处理

语法:

1
2
3
4
def  函数名(形参):
代码1
代码2
…….

函数名(实参)

实例:利用函数实现两个数据的相加,这两个数据是用户随意给出的

快速代码体验

image-20211009153051083

函数的返回值

读前须知:函数在定义的时候,函数体下面的代码不执行,调用的时候才执行

函数返回值

功能:在函数中,如果需要函数返回结果数据就需要用到函数返回值了,返回值的值就是调用函数时函数的值
注意事项:函数的返回值就像是在调用函数时将返回值赋值给调用函数

语法:

1
2
3
def  buy():
return “烟”
printbuy())

return返回值功能:

1,返回函数的结果数据
2,return具有退出函数功能,即调用函数时,在函数体内return下方的所有代码不执行

实例:用户输入两个数据值,分别为6和8,利用函数求和并且返回和的值

快速代码体验

image-20211009153116770

函数的说明文档

函数的说明文档

功能:快速查看定义的函数功能以及其程序员给出的解释

语法1(说明文档的书写):

1
2
3
4
5
def  函数名(参数):
“”“函数说明文档”“”
代码1
代码2
…….

语法2(函数说明文档的查看):利用 help(查看的函数名)

注意事项:

1,函数的说明文档只能书写在定义函数的第一行,采用多行注释的格式
2,利用 help(查看的函数名)查看函数的说明文档时,查看的函数名书写不要带括号

快速代码体验

image-20211009153202547

函数说明文档的高级写法(多行注释中间敲回车):

快速代码体验

image-20211009153215807

函数的嵌套

读前须知:函数在定义的时候,函数体下面的代码不执行,调用的时候才执行

什么是函数的嵌套?

答:函数的嵌套就是在定义函数下方缩进的代码中调用另外一个函数

函数嵌套功能:简化代码

快速代码体验

image-20211009153237980

函数嵌套例题

例题1:利用函数的嵌套打印多条横杠 —————- 用户要求打印几条,就要打印几条

步骤:
第一步,先定义一个函数打印一条横杠
第二步,在定义另外一个函数,要求有形参(形参是用户要求打印的条数)
第三步:利用形参以及循环调用函数打印多条横杠

快速代码演示

image-20211009153254974

例题2:利用函数的嵌套求解三个数据和的平均值

结题步骤:

1,先定义一个函数用来求解三个数据的和
2,在定义一个函数,函数内部嵌套上面定义的函数,用来求解三个数据的平均数
3,最后调用后面的函数来打印三个数据的平均值

快速代码体验

image-20211009153307265

函数进阶:变量作用域

读前须知:函数在定义的时候,函数体下面的代码不执行,调用函数的时候才执行

什么是局部变量以及全局变量呢?

答:局部变量就是定义在函数体内部的变量,函数调用完成后则销毁这个变量,当外界访问此变量时会报错(作用范围是局部)

全局变量就是定义在函数体外部的变量,在任何位置都可以进行访问 (作用范围全局)

快速代码体验(局部变量)

image-20211009153331268

快速代码体验(全局变量)

image-20211009153341992

怎么在函数内部修改全局变量呢?

答:利用 global 在函数内部声明变量为全局变量后,在进行更改即可

快速代码体验:

image-20211009153351596

函数返回值(多个返回值)

读前须知:定义函数的时候,函数体下方的代码不执行,调用该函数的时候,函数体下方的代码才执行

函数返回多个返回值的错误代码演示以及正确代码演示

错误代码演示

image-20211009153402255

正确代码演示

image-20211009153411600

函数多个返回值注意事项:

1:函数多个返回值是在return后面写多个数据,而不是在函数内部写多个return

2:return后面书写的多个数据,默认返回格式为元组,当然也可以是列表、字典,需用户手动更改格式

函数的参数(四种形式)

函数参数第一种形式:位置参数

位置参数详解:定义函数的形参以及调用函数的实参他们的意思以及位置是一一对应的

注意事项:形参与实参相互之间传递数据时,形参以及实参的位置和顺序及数量要一致

快速代码体验(name对应TOM,age对应20,gender对应男)

image-20211009153428240

函数参数第二种形式:关键字参数

关键词参数详解:调用函数的实参利用赋值的形式将实参值传递给形参(关键字参数不在乎位置)

注意事项:如果在函数调用的时候,有位置参数,那么位置参数的位置一定要在关键字参数前面

快速代码体验

image-20211009153438023

函数参数第三种形式:缺省参数(默认值参数)

注意事项:

1,如果在定义函数时给形参赋值了默认值,但在调用函数的时候,又给形参赋了另外值,则这个形参值为另外值

2,所有位置参数都要在缺省参数前面(包括函数定义以及调用)

快速代码体验

image-20211009153450140

函数参数第四种形式:不定长参数(包裹位置参数,包裹关键字参数)

应用场景:调用函数时不确定传递参数的个数时候用到的方法(参数个数可以是0也可以是其他数)

包裹位置参数语法:

1
2
3
4
def  函数名(*args):
printargs
函数名(数据1,数据2,数据3,………)
函数名()

快速代码体验(包裹位置参数)

image-20211009153503371

包裹关键字参数语法:

1
2
3
4
def 函数名(**kwargs):
printkwargs
函数名(name = “TOM”,age = 20,……..)
函数名()

快速代码体验(包裹关键字参数)

image-20211009153512794

注意事项:

1:无论是包裹位置参数还是包裹关键字参数,都是一个组包的过程
2:包裹位置参数在调用函数打印数据的时候,参数数据是存放在元组中的
3:包裹关键字参数在调用函数打印数据的时候,参数数据是存放在字典中的

拆包(元组与字典)

元组的拆包

功能:将元组进行拆分,分解成独立的数据(元组内有几个数据,就用几个变量来接收,这就是拆包)

语法:

1
2
3
4
5
def package():
return 1,2
num1,num2 = package()
print(num1)
print(num2)

快速体验元组的拆包

image-20211009153534176

字典的拆包

字典拆包详解:字典拆包就是将字典内所有键赋值给变量(提取字典中所有的键,有几个键,就要用几个变量接收)

注意事项:字典中有几个键,就用几个变量来接收键

语法:

1
2
dict1 = {“name”:“TOM”,“age”:21}
key1 ,key2 = dict1

快速上机体验

image-20211009153550964

交换两个变量的值

方法一:定义中间变量法
快速代码体验

image-20211009153603174

方法二:互转法(更简单,代码量更少,工作时推荐这种方法)
语法:a , b = b , a

image-20211009153610278

引用(id)

了解应用(id)

在python中,值(数据)是靠引用来传递的

理解引用:计算机内存是用来存放数据的,引用就像是内存的地址门牌号,引用是一个十进制的值(引用粗暴理解就是变量名)

语法:利用 id(变量名)来求引用,引用是一个十进制数

图解:

image-20211009153704353

注意事项:

1,如果两个不可变类型变量的引用(id)是一样的,那么说明这两个变量的值是相同的

2,int是不可变类型!!

不可变类型(int)引用代码体验

image-20211009153722163

可变数据类型(list)引用代码体验

image-20211009153729548

可变数据类型与不可变数据类型

可变数据类型如下:

1,列表
2,字典
3,集合

不可变数据类型如下:

1,整形(int)
2,浮点型(float)
3,字符串
4,元组

可变类型和不可变类型本质就是变量存储的数据发生改变时,内存是否开辟出新的内存空间存储改变后的数据,如果开辟了则是不可变数据类型,没有开辟就是可变数据类型

图解(不可变数据类型):

image-20211009153751316

图解(可变数据类型):

image-20211009153800035

递归(重要!!)

什么是递归?(教程223p)

答:递归特点

1,递归就是,定义函数的时候,函数体内部再调用函数自身(函数内部自己调用自己)
2,递归必须要有出口
3,注意函数返回值的位置是在调用函数时(就相当于把返回值赋值给调用函数语句)

递归应用场景

1,遍历一个文件夹下所有文件时,会利用递归
2,人工智能算法离不开递归,比如说快速排序

利用递归实现数据1到6的相加之和

image-20211009153911209

利用递归函数实现1到100累加的和

image-20211009153918309

递归流程

image-20211009153926273

递归没有设置出口的情况:

最大递归深度不同计算机数值不同,一般为(990——1000)

image-20211009153935578

lambda表达式(重要)

lambda表达式(匿名函数)

功能:简化函数代码

应用场景:定义函数时,函数只有一个返回值且函数体内部只有一行代码,就可用lambda表达式简化代码

语法:
第一种形式:变量名 = lambda 参数的形参 :返回值
第二种形式:( lambda 参数的形参 :返回值) (参数的实参)
第二种形式可直接用print(( lambda 参数的形参 :返回值) (参数的实参))打印

注意事项:

1,同等情况下,书写函数代码比书写lambda表达式占用内存高
2,lambda表达式又叫匿名函数,因此打印返回值时,变量名要加括号例如print(fun())否则打印lambda地址
3,lambda表达式的参数可以是多个,也可以没有
4,lambda表达式只能有一个返回值

快速代码体验(计算两个数据的和)第一种语法:

image-20211009154001553

第二种语法:

image-20211009154008142

lambda表达式参数(重要)

第一种:无参数
语法:变量名 = lambda : 返回值
快速代码体验

image-20211009154054361

第二种:一个参数
语法:变量名 = lambda 参数的形参 :返回值
快速代码体验

image-20211009154104878

第三种:缺省参数
语法:变量名 = lambda b, c, d = 100 : b + c + d
注意事项:缺省参数 d = 100 无论是在定义lambda表达式,还是调用都要放在参数的最后面赋默认值
快速代码体验

image-20211009154113674

第四种:不定长参数——包裹位置参

应用场景:在不确定参数的个数时使用

语法:变量名 = lambda *args :args

注意事项:包裹位置参数返回值的数据类型为元组

快速代码体验

image-20211009154126590

不定长参数——包裹关键字参数

语法:量名 = lambda **kwargs :kwargs

注意事项:包裹关键字参数返回值的数据类型为字典

快速代码体验

image-20211009154135127

lambda表达式应用(重要)

应用一:带判断的lambda表达式

功能:判断lambda的参数是否满足某些条件,从而返回一个值

语法:量名 = lambda 形参1,形参2 :形参1 if 形参1 > 形参2 else 形参2

其中 形参1 if 形参1 > 形参2 else 形参2 是三目运算符,意思为如果形参1大于形参2则返回值为形参1,反之返回形参2

实例:判断两个数据a,b的大小,a大于b返回值为a,a小于b返回值为b

image-20211009154151562

应用二:列表内嵌套字典,要求在列表内按照字典的某个key对应的value进行排序

注意事项:

1:列表排序用sort方法,当列表内嵌套字典时sort有两个值,一个是key的值,一个是reverse的值

2:列表嵌套字典时sort的key值表示按照字典哪个key对应的value进行排列

快速代码体验

image-20211009154203771

高阶函数

高阶函数的定义

高阶函数就是把一个函数的函数名(通常是abs函数与round函数)作为另外一个函数的实参传入,这就叫做高阶函数

abs()函数与 round()函数

abs()函数详解

功能:绝对值函数,就是将abs(数字数据)括号里面的数字数据进行绝对值化

语法:abs(数字数据)

快速代码体验

image-20211009154341168

round()函数详解

功能:四舍五入函数,就是将folat数据进行四舍五入

语法:round(需要四舍五入的数据)

快速代码体验

image-20211009154354792

高阶函数体验

高阶函数:将一个函数的函数名作为另外一个函数的实参传入

功能:让代码更加简洁,函数更加灵活

快速代码体验(将abs()函数的abs函数名传入到fn()函数中)

image-20211009154405120

高阶函数

一:map(func,lst)函数

功能:map(func,lst)函数是将传入的功能函数func作用在lst列表的每一个元素中,并返回python2/列表,python/迭代器(func和lst只是序列名,func代表函数名,lst代表列表名)

语法:p(功能函数,序列)其中func代表为传入的函数名,lst代表列表序列

注意事项:map函数的返回值在python3是迭代器,因此查看结果要将迭代器转换为列表

实例:利用map()函数将列表list1 = [1,2,4,8]中的每一个数据加平方

image-20211009154418839

二:reduce(func,lst)函数

功能:将函数名为func的函数作用在lst整个列表序列中,实现列表中所有数据的累计计算处理(通常是所有数据的相加、相乘等)

语法:functools . reduce(功能函数,序列),其中调用reduce函数要先导入functools模块

注意事项:

1:传入reduce函数的func函数必须要有两个形参,因为func功能是将序列中的所有数据做累积运算
2:使用reduce函数前要先导入functools模块

实例:将列表list1 = [1,5,6,8]中的所有数据进行相加或相乘

image-20211009154433998

三:filter(func,lst)过滤函数

功能:将func函数的功能作用在lst这个序列的所有元素中,func函数通常是过滤功能。

语法:filter(功能函数,序列)

注意事项:

1:调用filter函数返回值在python3中是一个迭代器,因此查看序列过滤后的结果要将迭代器转换为列表等其他序列
2:功能函数func通常是过滤功能,因此func函数的返回值是序列中满足条件的数据

实例:过滤列表序列list1 = [1,2,3,4,5,6,7,8,9]的数据,过滤条件为可以被2整除的数据

image-20211009154450068

总结注意事项:

map函数与reduce函数区别:

1:调用map函数返回值是迭代器,而reduce是一个数值
2:map函数可直接调用,reduce调用前需要导入functools模块
3:map函数的功能函数只有一个参数,而reduce的功能函数有两个参数
4:map函数每次对序列中一个数据进行处理,而reduce是两个数据,因此reduce有两个参数

未完待续……