1、基础概念
- 函数的参数,指的是函数定义中声明的变量,用于接收函数调用时传递的数据。参数允许我们将值或引用传递给函数,以便在函数内部使用这些值进行计算、操作或处理。
- 函数参数可以有多个,每个参数都一个名称和类型。函数定义中的参数称为形式参数(简称形参),而函数调用时传递的实际值成为实际参数(简称实参)。
- 函数的参数允许函数在不同的上下文中接收不同的数据,并且增加了函数的灵活性和可复用性。通过合理使用函数参数,可以编写出更通用、灵活的参数。
def 函数名(形式参数):
代码块
函数名(实际参数)2、案例演示
def sum_num(n): #此处的n为形式参数,声明函数时要用
ret = 0
for i in range(n+1): #定义了形参n在函数内的用途
ret += i
print(ret)
sum_num(100) #此处100为实际参数,调用函数时赋值给形参
3、三种参数
- 位置参数:
位置参数是按照定义式的顺序进行传递的参数,调用函数时,实参的位置必须与形参的为一一对应
#案例1
def sum_num(m,n): #此处的m,n为形式参数,声明函数时要用
ret = 0
for i in range(m,n+1): #定义了形参m,n在函数内的用途
ret += i
print(ret)
sum_num(20,100) #此处20和100为实际参数,分别传参给m和n如果少写参数,会报错

#案例2
def email_send(tname,tjobid,content):
print(f"员工:{tname},工号:{tjobid},{content}")
teachers = {
101:{"name":"司马迁","age": 28,"class":"历史"},
102:{"name":"祖冲之","age":42,"class":"数学"},
103:{"name":"张衡","age":32,"class":"地理"},
104:{"name": "王安石", "age": 42, "class": "政治"},
}
content = input("输入文字内容:")
for k,v in teachers.items():
email_send(v["name"],k,content)
- 默认参数
默认参数是函数声明时为参数指定默认值。如果在函数调用时没有传递该参数的值,函数将使用默认值。默认参数一定放在位置参数的后面。
#案例1
teachers = {
101:{"name":"司马迁","age": 28,"class":"历史","gender":"男"},
102:{"name":"祖冲之","age":42,"class":"数学","gender":"男"},
103:{"name":"张衡","age":32,"class":"地理","gender":"男"},
104:{"name":"李清照","age": 28,"class":"文学","gender":"女"},
}
def teacher_info(tname,tjobid,tgender="男"):
print(f"姓名:{tname},性别:{tgender},工号:{tjobid}")
for k,v in teachers.items():
if v["gender"] == "男":
teacher_info(v["name"],k)
elif v["gender"] == "女":
teacher_info(v["name"], k,v["gender"])如果信息中gender为男时,就默认打印tgender = "男"的参数,该参数在调用时就没有写。若gender为女,打印出实际参数即可

练习题:将累加和处理的程序,可以传一个值作为end进行累加计算,也可以是两个值,分别是start和end
def sum_pro(m,n=0):
sum = 0
if m > n: #默认参数不能在位置参数前,所以需要
for i in range(n, m+1): #对m和n进行换位
sum += i
else:
for i in range(m,n+1):
sum += i
print(sum)
sum_pro(1,20)
sum_pro(101)- 关键字参数
关键字参数是通过指定参数名来传递的参数。调用函数时,可以根据参数名来传递实参,而不必遵循形参的顺序。
关键字参数一定要在位置参数后面
关键字参数+默认值参数案例,数据如下
teachers = {
101:{"name":"司马迁","age": 28,"class":"历史","gender":"男"},
102:{"name":"祖冲之","age":42,"class":"数学","gender":"男"},
103:{"name":"张衡","age":32,"class":"地理","gender":"男"},
104:{"name":"李清照","age": 28,"class":"文学","gender":"女"},
}如果只想传参数到工号、姓名和年龄,而授课与性别字段在函数定义又必须要写,可写成:
def teacher_show(jobid,name,age,tclass = None,gender = None):
print(f"教师姓名:{name}")
print(f"教师工号:{jobid}")
#为了不让输出显示None,做了个判断
if gender:
print(f"教师性别:{gender}")
for k,v in teachers.items():
jobid = k
name = v["name"]
age = v["age"]
teacher_show(jobid, name, age)
目前信息中想再把性别加上,但不加授课科目,因此是跳过tclass字段而给gender赋值输出,这里就用到了关键字参数
def teacher_show(jobid,name,age,tclass = None,gender = None):
print(f"教师姓名:{name}")
print(f"教师工号:{jobid}")
if gender:
print(f"教师性别:{gender}")
for k,v in teachers.items():
jobid = k
name = v["name"]
age = v["age"]
teacher_show(jobid,name,age,gender="男")
如此操作,发现输出的性别都是男了,这与实参中将关键字参数gender设置为“男”有关系,所以再做下判断即可
def teacher_show(jobid,name,age,tclass = None,gender = None):
print(f"教师姓名:{name}")
print(f"教师工号:{jobid}")
if gender:
print(f"教师性别:{gender}")
for k,v in teachers.items():
jobid = k
name = v["name"]
age = v["age"]
teacher_show(jobid,name,age,gender="男")
if v["gender"] == "女":
teacher_show(jobid, name, age, gender="女")注意:默认参数和关键字参数一般搭配使用,二者都放在位置参数的后面。如果表格中某一项参数想跳过,需要在声明函数时将该参数设置到位置参数后面再配为默认参数或者关键字参数。
- 可变数量参数
可变数量参数允许函数接收不定数量的参数。在函数定义中,可以使用特殊符号来表示可变数量的参数,如*args用于接收任意数量的位置参数,**kwargs用于接收任意数量的关键字参数。
(1)*args的用法
#一般而言,单一变量只能对应赋给一个值
x,y,z = [1,2,3]
#但使用*args方法,可以单变量有多个赋值,多个赋值会以容器的方式赋值给*变量
x,y,*z = [1,2,3,4,5,6]
练习:计算一个数组中所有元素之和
#由于数组中有多少个元素不知道,所以可使用*args方式
def num_sum(*args):
sum = 0
for i in args: #此处注意是对args循环遍历,而不是*args
sum += i
print(sum)
注意:函数如果定义了位置参数后接*args,传参时会先将参数分别对应给位置参数,之后剩余的传参会作为*args的参数,比如

- **kwargs的用法
(1)用法一:
**kwargs属于字典的解包动作,所以该种用法只适用于字典。
#若字典
data = {k1:v1,k2:v2,k3:v3}
#则**data的内容就为
**data => k1=v1,k2=v2,k3=v3由此也得知,函数的声明部分,需要结合字典来设定形参;在函数调用时,**kwargs通过对字典的解析将值一一传递给函数。所以函数声明时的形参,必须和字典中的键值一致。
注意:解析的字典有不能嵌套
#数据
teachers = {
101:{"name":"司马迁","age": 28,"tclass":"历史","gender":"男"},
102:{"name":"祖冲之","age":42,"tclass":"数学","gender":"男"},
103:{"name":"张衡","age":32,"tclass":"地理","gender":"男"},
104:{"name":"李清照","age": 28,"tclass":"文学","gender":"女"},
}
#函数声明
def teachers_show(name,age,tclass,gender):
print(f"name是{name}")
print(f"age是{age}")
print(f"tclass是{tclass}")
print(f"gender是{gender}")
#函数使用
for i in teachers:
teachers_show(**teachers[101])(2)用法二:
在声明函数将其作为形参后,可在调用函数时将多个关键字参数写入作为其实参。**kwargs在调用函数时,若传参未指定关键字参数时,其值是为空字典。

调用示例:
teachers = {
101:{"name":"司马迁","age": 28,"tclass":"历史","gender":"男"},
102:{"name":"祖冲之","age":42,"tclass":"数学","gender":"男"},
103:{"name":"张衡","age":32,"tclass":"地理","gender":"男"},
104:{"name":"李清照","age": 28,"tclass":"文学","gender":"女"},
}
def teacher_show(name,age,**kwargs):
print(f"name是{name}")
print(f"age是{age}")
tclass = kwargs.get("tclass")
gender = kwargs.get("gender")
if tclass:
print(f"授课是{tclass}")
if gender:
print(f"性别是{gender}")
for i in teachers.values():
teacher_show(i["name"],i["age"],tclass=i["tclass"],gender=i["gender"])总结:**kwargs是关键字参数的集合版,关键字参数在声明时将每一个非必要形参配置为key = None,之后调用函数传实参时,若不用不写该key即可,若用该key就给一个key = value的值即可;而**kwargs在声明时可将非必要形参统一代表,调用函数传入实参时与前者一致。
















