形参和实参
定义函数时括号里的变量,叫做形式参数(形参);
调用函数时括号里传入的值,叫做实际参数(实参);
形参只是形式中的一种参数,是定义函数时需要使用的变量;而实参是一个实实在在存在的参数,是我们赋予变量的值。
缺省参数
缺省(default)也就是默认的意思,我们可以在定义函数时就给形式参数赋予一些默认的实参值,这些被赋予了默认实参值的形参,就被称作缺省参数。
注意:缺省参数在定义时要在一般参数之后,如果不遵守,Python就会无情的抛出一个报错。# 定义函数时给形式参数 pi设置一个默认的实参
def circle(r, pi=3.14159):
area = pi * r ** 2
return area
# 调用函数时不给pi一个实际参数值,这时候pi是3.14159
my_area = circle(10)
print("半径为10的圆的面积是{}".format(my_area))
# 调用函数时修改缺省参数pi的值为3.14
my_area = circle(10,3.14)
print("半径为10的圆的面积是{}".format(my_area))
参数传递
在调用函数时,通过实参给形参赋值的过程,就是参数传递。常见的参数传递有四种:位置传参、序列传参、关键字传参和字典关键字传参。
位置传参
在使用位置传参的方法时,实参和形参位置一 一对应。一旦你使用了错误的顺序,传参结果就会出现混乱。def person(name, age=22, gender='男'):
print ("姓名:", name)
print ("年龄:", age)
print ("性别:", gender)
person ("杨紫", 27, "女")
序列传参
和位置传参相似,序列传参时,是将序列按照索引顺序进行拆解后,位置与形参一 一对应。实际应用中,使用列表和元组传参都是非常方便的方式,但是我们很少会用字符串进行传参。
它的格式比较特殊,在调用函数传入实参时,用一个星号* 加上参数名,来看下面的例子。def person(name, age=22, gender='男'):
print ("姓名:", name)
print ("年龄:", age)
print ("性别:", gender)
# 使用*加列表
person (*["杨紫", 27, "女"])
# 使用*加元组
print ("\n元组:")
person (*("杨紫", 27, "女"))
# 使用*加字符串
print ("\n字符串:")
person (*"123")
关键字传参
使用关键字传参的方法时,参数位置的对应将变得不再重要。因此关键字传参的方法尤其适用于参数很多,默认参数也多,你无法准确记住参数顺序的时候。def person(name, age=22, gender='男'):
print ("姓名:", name)
print ("年龄:", age)
print ("性别:", gender)
# 关键字传参
person (gender="女", name="杨紫", age=27)
字典关键字传参
字典关键字传参就是将字典作为实参,并用两个星号**拆解。字典的键名和形参名必须一致,也就是说字典的键名必须符合变量的命名规则,且必须存在于形参中。def person(name, age=22, gender='男'):
print("姓名:", name)
print("年龄:", age)
print("性别:", gender)
# 字典关键字传参
person (**{'gender':"女", 'name':"杨紫", 'age':27})
传递练习def person(name, age, hight, weight, hair='黑', eye='棕', gender='男'):
print("姓名:", name)
print("年龄:", age)
print("身高:", hight)
print("体重:", weight)
print('发色:', hair)
print('瞳色:', eye)
print("性别:", gender,'\n')
person('张三', 20, 170, 90)
person(*['张三', 20, 170, 90])
person(age=20,name="张三",hight=170,weight=90)
person(**{'name':'张三','age':20,'weight':90,'hight':170})
person (*["小猫", 3, '23cm'], '4kg', **{'gender':'女', 'eye':'蓝', 'hair':'白'})
定义形参
形参定义和参数传递是一 一对应的,因此形参定义也有四种方式:位置形参、可变形参、关键字形参和字典关键字形参。
位置形参
def fruits(name, fruit1, fruit2, fruit3):
print (name,'喜欢的水果有:', fruit1, fruit2, fruit3)
fruits('小K', '苹果', '梨子', '桃子')
可变形参
它解决的是参数长度不固定的情况,作用是收集多余的位置传递过来的实参,可变形参的语法如下。
def fruits(name, *fruit):
print(name,'喜欢的水果有:', fruit)
print(type(fruit))
fruits('小K', '苹果', '梨子', '桃子', "葡萄")
fruits('小K', *['苹果', '梨子', '桃子', "葡萄"])
关键字形参
第一种语法中,关键字形参需要一个特殊分隔符*,在分隔符*后面的参数被视为关键字形参,调用时必须使用关键字传参的方法。def transcript(name, year, month, *, Physics, Chemistry, Biology):
print('{}同学{}年{}月理科成绩单:'.format(name, year, month))
print('物理:', Physics)
print('化学:', Chemistry)
print('生物:', Biology)
transcript("小明", 2019, 5, Physics=76, Chemistry=65, Biology=42)
第二种语法中,在一系列关键字形参之前添加了可变形参,调用时也必须使用关键字传参的方法。def transcript(name, *date, Physics, Chemistry, Biology):
print('{}同学{}年{}月理科成绩单:'.format(name, date[0], date[1]))
print('物理:', Physics)
print('化学:', Chemistry)
print('生物:', Biology)
transcript("小明", 2019, 5, Physics=75, Chemistry=65, Biology=42)
字典关键字形参
字典关键字形参的语法形式为**字典名,所以字典关键字形参也叫双星号字典形参。
def transcript(name, year, month, **grade):
print('{}同学{}年{}月成绩单:'.format(name, year, month))
for subject in grade:
print(subject, ':', grade[subject])
# 只传入位置参数
transcript("小明", 2019, 5)
# 关键字传参传入两个关键字参数
transcript("小明", 2019, 5, 数学=144, 语文=124)
# 字典关键字传参传入三个关键字参数
transcript("小明", 2019, 5, **{'数学':144, '语文':124, '英语':115})
总结
形参:即形式参数,定义函数时( )里的象征意义的变量。
实参:即实际参数,给形参传入的有意义的值。
代码复用:使用函数式编程的方式,重复利用代码。
缺省参数:即默认参数,是指被赋予了默认实参值的形参。
参数传递:在调用函数的过程中通过实参给形参赋值的过程。
点餐练习
朋友开了一家茶馆,想要请你帮忙开发一个电子点单功能。要求是:客人点单后,程序可以把桌号和对应餐品自动打印在后厨的电子屏上。def order(number, *menu):
print('桌号:{},点餐:'.format(number))
for i in menu:
print(i,end="\t")
print('\n')
order('001',*['牛肉盖浇饭','1份'])
order('002',*['拉面','3份'])def order(number, **menu):
print('桌号:{},点餐:'.format(number))
for name in menu:
print(name,menu[name],end="\n")
print('\n')
order('001',**{'牛肉面':'1份','炸酱面':'2份'})
order('002',水果='1份',炸酱面='4份')