欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
文章目录
- 前言
- 一、函数多返回值
- 二、函数的多种传参方式
- 三、匿名函数
前言
在Python中,函数是组织代码、提高重用性与可读性的基本构建块。随着程序逻辑的复杂性增加,函数的使用也逐渐演变出更多的形式和技巧。本章详细讲解了Python函数的进阶使用,包括函数的多返回值、函数的多种传参方式以及匿名函数。
本篇文章参考:黑马程序员
一、函数多返回值
思考:如果一个函数有两个return (如下所示),程序会如何执行?
def test_return():
return 1
return 2
result=test_return()
print(result)
输出结果:
1
可以看出,该段代码只执行了第一个return。因为return可以退出当前函数,导致return下方的代码不执行,所以代码执行到第一个return后,就会退出函数,导致第二个return不被执行。
那如果一个函数要有多个返回值,该如何书写代码?
基本语法:
def 函数名():
return 返回值1,返回值2
变量1,变量2= 函数名()
print(变量1)
print(变量2)
按照返回值的顺序,写对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据return。
def test_return():
return 1,"Hello",True
x,y,z=test_return()
print(x)
print(y)
print(z)
输出结果:
1
Hello
True
二、函数的多种传参方式
函数有四种常见的参数使用方式:
- 位置参数
- 关键字参数
- 缺省参数
- 不定长参数
①位置参数:
调用函数时根据函数定义的参数位置来传递参数。
注意:传递的参数和定义的参数的顺序及个数必须一致
def user_info(name,age,gender):
print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 位置参数
# 需按照参数定义的顺序传参
user_info("小明",20,"男")
#错误示范:不按照固定的顺序会导致内容错乱
user_info("男","小明",20)
姓名:小明,年龄:20,姓名是:男
姓名:男,年龄:小明,姓名是:20
②关键字参数:
函数调用时通过“键=值”形式传递参数。
作用:可让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name,age,gender):
print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 关键字参数
# 可不按照参数定义的顺序传参
user_info(name="小王",age=11,gender="女")
user_info(age=12,gender="女",name="小晓")
输出结果:
姓名:小王,年龄:11,姓名是:女
姓名:小晓,年龄:12,姓名是:女
③位置参数和关键字参数混用:
位置参数和关键字参数混用时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
def user_info(name,age,gender):
print(f"姓名:{name},年龄:{age},姓名是:{gender}")
# 位置参数和关键字参数混用
user_info("小菲",age=15,gender="女")
# 错误示范:会报错 SyntaxError: positional argument follows keyword argument
# user_info(name="小菲",15,"女")
输出结果:
姓名:小菲,年龄:15,姓名是:女
④缺省参数:
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传递该默认参数的值。
作用:当调用函数时没有传递参数, 就会使用缺省参数对应的值。
注意:所有无默认值的参数必须放在任何带有默认值的参数之前。
# 缺省参数
# 所有无默认值参数的参数必须放在任何带有默认值的参数之前
def user_info(name,age=11,gender="男"):
print(f"姓名:{name},年龄:{age},姓名是:{gender}")
user_info("小天",)
user_info("小美",13,"女")
# 错误示范,会报错 yntaxError: parameter without a default follows parameter with a default
# def user_info(name="小美",age,gender):
#print(f"姓名:{name},年龄:{age},姓名是:{gender}")
输出结果:
姓名:小天,年龄:11,姓名是:男
姓名:小美,年龄:13,姓名是:女
⑤不定长参数:
不定长参数也叫可变参数,用于函数调用时不确定传递多少个参数(不传参也可以)的场景。
不定长参数的类型:
- 位置传递
传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型。(*)表示可以接收不定数量的位置参数。
基本语法:
def 参数名(*args):
print(args) - 关键字传递:
参数是“键=值”的形式, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典。(**)表示接收不定数量的关键字参数。
基本语法:
def 参数名(**kwargs):
print(args)
# 位置不定长,*号
# 不定长定义的形式参数会作为元组存在,接收不定长数量的参数传入
def user_info(*args):
print(f"args参数的类型为{type(args)},内容为{args}")
user_info(1,2,3,"小明","男孩")
输出结果:
args参数的类型为<class ‘tuple’>,内容为(1, 2, 3, ‘小明’, ‘男孩’)
# 关键字不定长,**号
def user_info(**kwargs):
print(f"kwargs参数的类型为{type(kwargs)},内容为{kwargs}")
# 错误示范:传进的参数必须是“键=值”的形式,否则会报错 TypeError: user_info() takes 0 positional arguments but 5 were given
# user_info(1,2,3,"小明","男孩")
user_info(name="小明",age=15,gender="男")
输出结果:
kwargs参数的类型为<class ‘dict’>,内容为{‘name’: ‘小明’, ‘age’: 15, ‘gender’: ‘男’}
三、匿名函数
①函数作为参数传递:
在前面的函数学习中,我们一直使用的函数都是接受数据(数字、字符串、字典、列表、元组等)作为参数传入。
其实,函数本身也可作为参数传入另一个函数内。
# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
result=compute(1,2) #确定compute是函数
print(f"compute参数的类型为{type(compute)}")
print(f"计算结果为{result}")
# 定义一个函数,准备作为参数传入另一个函数
def compute(x,y):
return x+y
# 调用并传入参数
test_func(compute)
输出结果:
compute参数的类型为<class ‘function’>
计算结果为3
【分析】
函数compute作为参数传入了test_func函数中使用,这是一种计算逻辑的传递而非数据的传递。
②lambda匿名函数:
函数的定义:
- def关键字可定义带有名称的函数,有名称的函数,可以基于名称重复使用。
- lambda关键字可定义匿名函数(无名称),无名称的匿名函数,只可临时使用一次。
匿名函数基本语法:
lambda 传入参数 : 函数体(一行代码)
- lambda 是关键字,表示定义匿名函数
- 传入参数表示匿名函数的形式参数,如x, y 表示接收两个形式参数
- 函数体即函数的执行逻辑(注意:函数体内只能写一行代码,无法写多行代码)
# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
result=compute(1,2)
print(f"计算结果为{result}")
# 通过lambda匿名函数的形式,将匿名函数作为参数传入
test_func(lambda x,y:x+y)
输出结果:
计算结果为3
lambda匿名函数更为简易,能提高代码的灵活性和可读性,适用于只需要使用一次的简单操作。