一、函数如何返回多个返回值
如果想让一个函数有多个返回值,该怎么办?
返回多个数据,按照返回值的顺序,用对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据return,如下列代码所示:
#加菲猫的食谱
def Garfield_menu():
return '千层面','披萨'
#变量a,b接收加菲猫爱吃的食物
a,b=Garfield_menu()
print(a)
print(b)
输出:
千层面
披萨
二、函数多种传参方式
2.1位置参数
调用函数时,根据函数定义的参数位置来传递参数,传递的参数和定义的参数,顺序及个数必须一致,如下所示:
#定义函数
def user_info(name,gender):
print(f"尊敬的{name}{gender},欢迎光临维多披萨店!")
#调用函数
user_info('加菲猫','先生')
输出:
尊敬的加菲猫先生,欢迎光临维多披萨店!
2.2关键字参数
调用函数时,通过“键=值”形式传递参数。
作用: 让函数更加清晰、容易使用,无需关注参数的顺序需求。
如果按照位置参数进行传参,容易混淆顺序:
#定义函数
def user_info(name,gender,age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info('加菲猫','先生','3','千层面')
user_info('美羊羊','女士','青草蛋糕','5')
输出:
加菲猫先生今年3岁了,最爱吃千层面!
美羊羊女士今年青草蛋糕岁了,最爱吃6!
按照关键字参数进行传参,“键=值”之间所属关系清晰明了:
#定义函数
def user_info(name,gender,age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫',gender='先生',age='3',food='千层面')
user_info(name='美羊羊',gender='女士',food='青草蛋糕',age='6')
输出:
加菲猫先生今年3岁了,最爱吃千层面!
美羊羊女士今年6岁了,最爱吃青草蛋糕!
注意:调用函数时,如果有位置参数,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
位置参数与关键字参数混合——例1:
#定义函数
def user_info(name,gender,age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info('加菲猫',gender='先生',age='3',food='千层面')
输出:
加菲猫先生今年3岁了,最爱吃千层面!
位置参数与关键字参数混合——例2:
#定义函数
def user_info(name,gender,age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info('加菲猫','先生',age='3',food='千层面')
输出:
加菲猫先生今年3岁了,最爱吃千层面!
位置参数与关键字参数混合——例3:
#定义函数
def user_info(name,gender,age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫','先生',age='3',food='千层面')
位置参数在关键字后面,运行报错:
2.3缺省参数
缺省参数也叫默认参数,用于定义函数时为参数提供默认值,调用函数时可不传该默认参数的值。(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
作用:函数调用时,如果没有传递参数,就会使用(定义函数时提供的)默认值;如果传递了参数,就会使用传递的值。
case1:没有传递参数,使用(定义函数时提供的)默认值。
#定义函数
def user_info(name,gender,age,food='千层面'):#默认加菲猫爱吃千层面
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫',gender='先生',age='3')#未传递food参数,使用默认值
输出:
加菲猫先生今年3岁了,最爱吃千层面!
case2:传递了参数,使用传递的值。
#定义函数
def user_info(name,gender,age,food='千层面'):#默认加菲猫爱吃千层面
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫',gender='先生',age='3',food='披萨')#传递了food参数,使用传递值
输出:
加菲猫先生今年3岁了,最爱吃披萨!
case3:多个默认值。
#定义函数
def user_info(name,gender='先生',age='3',food='披萨'):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫')
输出:
加菲猫先生今年3岁了,最爱吃披萨!
case4:默认参数出现在位置参数前面,运行报错。
#定义函数
def user_info(name,gender='先生',age,food):
print(f"{name}{gender}今年{age}岁了,最爱吃{food}!")
#调用函数
user_info(name='加菲猫',gender='先生',age='3',food='披萨')
运行报错:
注意:所有位置参数必须出现在默认参数前面!
2.4不定长参数
不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
作用: 当调用函数不确定传入参数个数时, 可以使用不定长参数。
不定长参数的类型主要包括位置传递和关键字传递。
2.4.1位置传递
位置不定长传递以*号标记一个形式参数,以元组的形式接收参数,形式参数一般命名为args。
请先看代码示例:
#定义函数
def func1(*args):
print(type(args))
print(args)
#调用函数
func1('喜羊羊','美羊羊','懒羊羊','软绵绵','红太狼','灰太狼')
输出:
<class 'tuple'>
('喜羊羊', '美羊羊', '懒羊羊', '软绵绵', '红太狼', '灰太狼')
传入的所有参数都会被args变量收集,它会根据传入参数的位置合并为一个元组(tuple),即args是一个元组,这就是位置传递。
2.4.2关键字传递
关键字不定长传递以**号标记一个形式参数,以字典的形式接收参数,形式参数一般命名为kwargs。
请先看代码示例:
#定义函数
def func1(**kwargs):
print(type(kwargs))
print(kwargs)
#调用函数
func1(加菲猫='披萨',欧迪='蛋糕')
输出:
<class 'dict'>
{'加菲猫': '披萨', '欧迪': '蛋糕'}
传入的所有参数皆为键值对形式(“键=值”),所有的“键=值”都会被kwargs接收, kwargs本质是一个字典。
三、匿名函数
3.1函数作为参数传递
在前面的函数学习中,传入的参数形式都是数据,包括: 数字、字符串、字典、列表、元组等。 实际上函数本身,也可以作为参数传入另一个函数内,如下图所示:
3.2 lambda匿名函数
通过lambda关键字,可以创建一个仅能使用一次的匿名函数。
语法:lambda 传入参数:函数体(只能写一行代码)
代码示例如下:
#定义函数func2,接受其他函数传入
def func2(add):
ret=add(1,2)
print(ret)
#通过lambda匿名函数的形式,将匿名函数作为参数传入
func2(lambda x,y:x+y)
输出:
3
在函数的定义中:
- def关键字,可以定义带有名称的函数,基于名称可以重复使用。
- lambda关键字,可以定义匿名函数(无名称), 无名称的匿名函数,只能临时使用一次。