python学习第10节:函数参数的力量

发布时间:2020/07/09 作者:天马行空 阅读(1385)

形参和实参
定义函数时括号里的变量,叫做形式参数(形参);
调用函数时括号里传入的值,叫做实际参数(实参);
形参只是形式中的一种参数,是定义函数时需要使用的变量;而实参是一个实实在在存在的参数,是我们赋予变量的值。

缺省参数
缺省(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))

图片.png


参数传递
在调用函数时,通过实参给形参赋值的过程,就是参数传递。常见的参数传递有四种:位置传参、序列传参、关键字传参和字典关键字传参。

位置传参
在使用位置传参的方法时,实参和形参位置一 一对应。一旦你使用了错误的顺序,传参结果就会出现混乱。

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})


图片.png


传递练习

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':'白'})


定义形参
形参定义和参数传递是一 一对应的,因此形参定义也有四种方式:位置形参、可变形参、关键字形参和字典关键字形参。

位置形参

图片.png

def fruits(name, fruit1, fruit2, fruit3):
    print (name,'喜欢的水果有:', fruit1, fruit2, fruit3)
fruits('小K', '苹果', '梨子', '桃子')


可变形参

它解决的是参数长度不固定的情况,作用是收集多余的位置传递过来的实参,可变形参的语法如下。

图片.png

def fruits(name, *fruit):
    print(name,'喜欢的水果有:', fruit)
    print(type(fruit))
fruits('小K', '苹果', '梨子', '桃子', "葡萄")
fruits('小K', *['苹果', '梨子', '桃子', "葡萄"])


关键字形参

图片.png

第一种语法中,关键字形参需要一个特殊分隔符*,在分隔符*后面的参数被视为关键字形参,调用时必须使用关键字传参的方法。

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)


字典关键字形参

字典关键字形参的语法形式为**字典名,所以字典关键字形参也叫双星号字典形参

图片.png

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})

图片.png


总结

形参:即形式参数,定义函数时( )里的象征意义的变量。
实参:即实际参数,给形参传入的有意义的值。
代码复用:使用函数式编程的方式,重复利用代码。
缺省参数:即默认参数,是指被赋予了默认实参值的形参。
参数传递:在调用函数的过程中通过实参给形参赋值的过程。

图片.png


点餐练习

朋友开了一家茶馆,想要请你帮忙开发一个电子点单功能。要求是:客人点单后,程序可以把桌号和对应餐品自动打印在后厨的电子屏上。

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份')


关键字python python教程