Chapter 15 Python函数进阶

欢迎大家订阅【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

二、函数的多种传参方式

函数有四种常见的参数使用方式:

  1. 位置参数
  2. 关键字参数
  3. 缺省参数
  4. 不定长参数

①位置参数:
调用函数时根据函数定义的参数位置来传递参数。
注意:传递的参数和定义的参数的顺序及个数必须一致

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匿名函数更为简易,能提高代码的灵活性和可读性,适用于只需要使用一次的简单操作。

  • 28
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值