一、函数的概念
函数:能够实现单一功能或者相关联功能的一段可以多次重复使用的代码段
结构化编程:使用函数进行功能拆分,并将拆分的功能组成整体实现程序执行
二、函数分类
内置函数:Python机制已经编写好的函数,直接调用即可
自定义函数:用户自定义(编程写出函数的具体代码),第三方库(直接调用即可)
三、函数的定义与调用
定义
def 函数名([参数]):
函数体
[return返回值]
返回值:可以是1个,也可以是多个,使用逗号分隔,函数调用时,有两种形式可以接收元组或使用对应个数的变量来接收。函数执行结果,是否需要根据函数功能决定,一般情况下,函数执行有结果时,需要返回值
调用
函数名([参数])
,如果函数定义时有参数,那么就必须传递传输(除有默认参数的情况)
四、函数的参数
- 形式参数:简称形参,是在函数定时,定义的参数,形参可以且只能在函数内部使用
- 实际参数:简称实参,是在函数调用时,定义的参数,实参一般在函数外部使用,不在函数内部使用
形参与实参关系:
形参是实参的一个代号,形参没有具体值,实参才有具体值,在函数调用时,形参会接收实参的具体值(实参会将具体值传递给形参)。形参和实参的类型与顺序都必须一一对应
形参分类:
位置参数:
最多使用的一种参数类型,按照参数编写的顺序(位置)来接收实参的值
my_name = "张三"
my_id ="123"
def print_student_info(s_name,s_id):
print(f"学生姓名是:{s_name}")
print(f"学生的学号是:{s_id}")
print_student_info(my_name,my_id)
关键字参数:
假如一个函数需要多个参数时,容易出现顺序错误的情况,关键字参数可以避免因为顺序不对导致参数传递错误的问题。关键字就是形参本身
my_name = "张三"
my_id ="123"
def print_student_info(s_name,s_id):
print(f"学生姓名是:{s_name}")
print(f"学生的学号是:{s_id}")
print_student_info(s_id=my_id,s_name=my_name) #不会因为顺序不对出现参数值错误
一般情况下,位置参数与关键字参数在函数调用时是二者皆可。在Python3.8以后,使用”/”来标识部分参数是只能接收位置参数。/前面只能是位置参数,/后面既可以是关键字参数,也可以是位置参数
my_name = "张三"
my_id ="123"
my_age = 20
def print_student_info(s_name,s_id,/,s_age):
print(f"学生姓名是:{s_name}")
print(f"学生的学号是:{s_id}")
print(f"学生的性别是:{s_age}")
print_student_info(my_name,my_id,s_age=my_age)
默认参数:
函数在定义的时候,给形参赋一个初始值(默认值)。函数调用时,可以不传递参数,若传递了参数,则以传递的参数进行运算。一般来说,最好设置默认参数,避免因为没有传递参数到底程序停止运行
def print_student_info(s_name='无名',s_id='000000',s_age='男'):
print(f"学生姓名是:{s_name}")
print(f"学生的学号是:{s_id}")
print(f"学生的性别是:{s_age}")
参数打包与解包:
打包:(针对形参进行打包)函数在定义时,无法确定需要传递多少个数据,那么可以在形参前面添加“*”或者“**”来表示多个参数
*:参数以元组的形式进行传递
**:参数以字典的形式进行传递
在函数定义内部,可以通过下标、键、循环遍历获取对应的参数
def test(*args):
print(args)
t = (1,2,3,4,5)
test(t)
解包:针对实参进行解包
将实参进行拆分,如果是*,那么就拆成元组,**就拆成字典形式(字典的键必须跟形参一致)
def test1(a,b,c):
print(a,b,c)
t = (1,2,3)
test1(*t)
混合参数使用:
优先级从高到低:位置参数>关键字参数>默认参数>打包(*>**)
在函数定义时:默认参数必须在普通之后(没有默认值或符号的参数),* 或者 **必须位于默认参数之后,且 ** 要在 * 之后
五、模块
库:第三方库、内置库
包:多个包组成一个库,包就是存储python文件的文件夹,必须包含__init__.py,当使用impot把模块导入到文件中时,会自动执行__init__.py
模块:多个模块组成一个包,包里面的.py文件函数:多个函数组成一个模块
语法:
From 包 import 模块:相当于将模块的绝对路径写清楚,所以调用函数时,直接使用函数名即可
import 模块:相当于只写了一个文件名,调用函数时,需要模块名.函数名
注意:避免循环导入:A里面导入B,B里面导入A