一. 函数的概念
如果在开发程序时候,如果需要某块代码多次,但是为了提高编写的效率以及代码的重用,可以把具有独立功能的代码块组织成为一个小模块,这就是函数。
二. 函数的定义和调用
1.定义:def 函数名:
函数要执行的内容
调用:
2.带参数的函数定义:
# 其中a和b为形式参数,简称形参
调用:
# 其中38和5438为实际参数,简称实参,是输入参数的时候填入的实际值
3.函数的定义格式:
def 函数名 (形参):
函数体(具体的功能性代码)
return 返回值(输出结果)
函数定义的调用格式:
变量名 = 函数名 (实际参数)——>其中变量获取的是最终的返回值
注:return不止返回参数,同时也结束了程序块的执行,并且回到调用该函数的位置。
4.函数的分类
内置函数,标准库函数,第三方库函数,用户自定义函数
5.函数调用的嵌套
6.练习题:
A. 根据输入的数量,打印对应行数的线:
写一个打印一条横线的函数
写一个函数,可以通过输入参数,打印自定义行数的横线
答案如下:
B.求三个数的平均值
写一个函数求三个数的和
写一个函数求三个数的平均值
答案如下:
三. 函数的深入理解
1.函数的名字以及内存地址:函数创建的内存逻辑同变量类似,也是要在内存中划分区域用作存储函数。地址可以传递。
2.函数的遍历调用:
根据上面的“函数的地址可以传递”,也可以进行如下操作:
3.函数的参数:
A.标准参数:位置参数,默认参数
位置参数:按照位置一一匹配,实参和形参的数量要一致,否则报错。
默认参数:有默认值的参数
# 不入实参的时候会使用默认值
# 因为调用函数的时候如果不指定形参名字,定义函数的时候,有默认值的形参要放置在没有默认值的形参后面写
# 如果关键实参和位置实参混合用,位置实参在前面,否则报错
B.可变个数参数:可变参数,关键字参数
# 在函数定义时,* 和**作用:将多个变量进行“打包”,变为元组和字典
可变参数 *args arguments
# 打包成元组
关键字参数 **kwargs keyword arguments
# 打包成字典,且入参的时候中文无序引号
====》在定义函数的时候,形参可以使用*和**来表示要在输出的时候对实参进行打包,那么在调用函数的时候,同样也可以使用* 和 **来给输入的实参先进行解包,如图:
# 这里入参的时候,使用了列表进行入参 ,则输出的时候是将整个列表看作一个元素进行打包,如果我们想要将其打散输出的话,那么在调用的时候就要使用解包*
# 这样先对列表进行了解包,打散,再进行打包
# 入参的时候带有字典类型的实参,也需要先使用**进行解包入参,再输出的时候打包
总结:
# 如果想要输出结果为元组(打包成元组),定义函数的时候使用*;如果想要输出结果为字典(打包成字典),定义函数的时候使用** # 如果函数定义的时候是*可变参数,调用时输入的实参如果是列表/元组的话,就需要在调用是加上*,先将其打散; # 如果函数定义的时候是**关键字参数,调用时输入的实参如果是字典,就需要在调用是加上**;
扩展:函数调用的时候,参数传递的顺序
位置参数——>关键字参数
args——>*args——>**args
# 关键字参数的后面,不再能使用位置参数,只能接着使用关键字参数
C.命名关键字参数
# 定义函数的时候,单独在形参位置放置一个*,是指该*后面的参数只能使用关键字参数,必须用命名的方式进行赋值。
四. 返回值:可以返回全部的数据类型
番外:返回多个返回值
当需要多个返回值的时候, 其实是将其封装在列表,字典,元组容器当中。(set会改变元素顺序)。