函数进阶—python

一、函数如何返回多个返回值

如果想让一个函数有多个返回值,该怎么办?

返回多个数据,按照返回值的顺序,用对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据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关键字,可以定义匿名函数(无名称), 无名称的匿名函数,只能临时使用一次。
  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值