当前位置: 首页 > article >正文

解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美

在这里插入图片描述

文章目录

  • 前言
    • 📖一、多值返回
      • 📚1.1 多值返回的概念
      • 📚1.2 工作原理
      • 📚1.3 应用场景
      • 📜总结
    • 📖二、 多种参数传递形式
      • 📚2.1 位置参数(Positional Arguments)
      • 📚2.2 关键字参数(Keyword Arguments)
      • 📚2.3 缺省参数(Default Arguments)
      • 📚2.4 多种参数形式的应用场景
      • 📚2.5 结合使用不同参数传递方式
      • 📜总结
    • 📖三、不定长参数
      • 📚3.1 位置不定长参数(*args)
        • 📄应用场景
      • 📚3.2 关键字不定长参数(**kwargs)
        • 📄应用场景
      • 📚3.3 位置不定长参数和关键字不定长参数的结合
      • 📚3.4 使用 * 和 ** 解包参数
      • 📜总结
    • 📖四、匿名函数lambda(只能支持一行代码)
      • 📚4.1 lambda 表达式的语法
      • 📚4.2 使用 lambda 作为参数
      • 📚4.3 lambda 在排序中的应用
      • 📚4.4 lambda 表达式的常见应用场景
        • 📄示例:结合 `map`、`filter` 和 `reduce` 使用
      • 📚4.5 lambda 表达式的局限性
      • 📜总结
  • 结语


前言

在 Python 编程中,函数是构建模块化、简洁代码的核心工具。Python 的函数功能不仅强大,还非常灵活:从多值返回到多种参数传递,再到匿名函数 lambda,Python 允许我们用更少的代码实现丰富的功能。掌握这些函数进阶技巧,不仅能提升代码的可读性和复用性,还能让我们更优雅地解决复杂问题。在这篇文章中,我们将深入探索 Python 函数的高阶特性,一步步提升你的编程技巧。


📖一、多值返回

在 Python 中,函数可以返回多个值。这种 多值返回 是 Python 函数的一项强大功能,它允许函数在返回时传递多个数据,而不需要将它们封装在一个容器(如列表或字典)中。

📚1.1 多值返回的概念

在 Python 中,函数可以通过逗号分隔多个返回值,Python 会自动将这些值封装成一个 元组 返回。调用者可以直接将返回的多个值解包到不同的变量中,这使代码更加简洁直观。

示例:

def test_return():
    return 1, 2, 3

# 使用多个变量接收返回的多个值
x, y, z = test_return()
print(x)  # 输出:1
print(y)  # 输出:2
print(z)  # 输出:3

在这个例子中,test_return 函数返回三个值 1, 2, 3。通过 x, y, z = test_return() 解包,xyz 分别获得返回的每个值。

输出:

1
2
3

📚1.2 工作原理

return 1, 2, 3 语句中,Python 会将返回的三个值自动打包成一个元组 (1, 2, 3)。调用函数时,可以直接解包该元组,将其赋值给多个变量。

📚1.3 应用场景

多值返回在需要函数返回多个相关数据时非常有用。例如:

  • 返回计算结果和状态:在一些函数中,你可能希望同时返回计算结果和操作状态。
  • 拆分数据:返回与数据相关的多个属性,比如返回坐标的 x, y, z 值等。

示例:计算操作结果和状态

def divide(dividend, divisor):
    if divisor == 0:
        return None, "Error: Division by zero"
    else:
        return dividend / divisor, "Success"

result, status = divide(10, 2)
print(f"Result: {result}, Status: {status}")

输出:

Result: 5.0, Status: Success

📜总结

  • 多值返回是 Python 中的一种简洁的返回方式。
  • 它自动将多个值封装为元组,并可以通过解包赋值给多个变量。
  • 这种功能在需要返回多个相关数据时非常有用,使代码更加简洁和易于理解。

📖二、 多种参数传递形式

在 Python 中,函数支持多种形式的参数传递。了解这些参数传递形式,可以使得函数更加灵活、可读性更高,也便于在不同场景下调用函数。主要的参数传递形式包括 位置参数关键字参数缺省参数 等。

📚2.1 位置参数(Positional Arguments)

位置参数是最常用的参数传递方式。调用函数时,按照参数在函数定义中的顺序依次传递。位置参数传递的代码更简洁,但需要保证参数顺序与定义顺序一致。

def user_info(name, age, gender):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")

# 使用位置参数调用函数
user_info('小明', 19, '男')

输出:

姓名是:小明, 年龄是:19, 性别是:男

📚2.2 关键字参数(Keyword Arguments)

关键字参数允许在调用函数时,显式指定参数名,顺序可以与定义时不一致。这种方式的代码更具可读性,适合参数较多的函数调用。

user_info(name='小明', age=19, gender='男')
user_info('小明', age=19, gender='男')

输出:

姓名是:小明, 年龄是:19, 性别是:男
姓名是:小明, 年龄是:19, 性别是:男

在上面的例子中,我们可以在调用时直接指定参数名,也可以混合使用位置参数和关键字参数。注意:如果混合使用,位置参数必须放在关键字参数之前

📚2.3 缺省参数(Default Arguments)

缺省参数(也叫默认参数)允许在定义函数时为参数设置一个默认值。如果调用函数时没有为该参数传值,则会使用默认值。缺省参数通常放在参数列表的末尾。

def user_info(name, age, gender='男'):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")

# 调用时不传 gender 参数,将使用默认值
user_info('小明', 19)

输出:

姓名是:小明, 年龄是:19, 性别是:男

在这个例子中,gender 参数的默认值是 '男',如果调用时未指定 gender 的值,就会使用这个默认值。如果调用时传递了 gender 的值,则使用传递的值覆盖默认值。

📚2.4 多种参数形式的应用场景

  • 位置参数:适合参数数量少且调用者能清晰记住参数顺序的情况。
  • 关键字参数:适合参数数量多或不容易记住参数顺序的情况,提高代码可读性。
  • 缺省参数:适合某些参数有常用默认值、且通常情况下不需要更改的情况。

📚2.5 结合使用不同参数传递方式

Python 函数的定义和调用可以灵活地结合这些参数传递方式。需要注意的是,在定义参数时,位置参数必须放在关键字参数之前,且缺省参数必须放在位置参数之后

def user_info(name, age=18, gender='男'):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")

# 使用位置参数和缺省参数
user_info('小明')
# 使用关键字参数指定部分参数
user_info(name='小红', gender='女')

输出:

姓名是:小明, 年龄是:18, 性别是:男
姓名是:小红, 年龄是:18, 性别是:女

📜总结

Python 提供了多种参数传递方式,合理使用这些方式可以让代码更具灵活性和可读性:

  1. 位置参数:最常用,按顺序传递。
  2. 关键字参数:显式指定参数名,适合参数较多的函数。
  3. 缺省参数:为某些参数指定默认值,使得调用时可以省略。

📖三、不定长参数

在 Python 中,不定长参数(Variable-length Arguments)允许我们编写能够接收可变数量参数的函数。这在定义通用、灵活的函数时非常有用。Python 支持两种不定长参数的形式:位置不定长参数关键字不定长参数

📚3.1 位置不定长参数(*args)

位置不定长参数通过在参数名前加一个星号 * 来定义,通常约定俗成命名为 *args。在函数内部,*args 会被视为一个 元组,包含所有传入的可变位置参数。

示例

def user_info(*args):
    print(f"args参数的类型是:{type(args)}, 内容是:{args}")

user_info(1, 2, 3, '小米', '男孩')

输出

args参数的类型是:<class 'tuple'>, 内容是:(1, 2, 3, '小米', '男孩')

在这个例子中,user_info 函数可以接受任意数量的参数,传入的多个参数被自动打包成一个元组 args。这种方式适合用于需要处理不确定数量的输入参数的情况。

📄应用场景
  • 处理任意数量的参数:比如日志函数,日志级别和日志内容的数量不确定时可以使用 *args
  • 列表解包:在调用时使用 * 可以将一个列表的元素拆开放入 *args

📚3.2 关键字不定长参数(**kwargs)

关键字不定长参数通过在参数名前加两个星号 ** 来定义,通常约定俗成命名为 **kwargs。在函数内部,**kwargs 会被视为一个 字典,包含所有传入的键值对参数。

示例

def user_info(**kwargs):
    print(f"kwargs参数的类型是:{type(kwargs)}, 内容是:{kwargs}")

user_info(name='小王', age=11, gender='男孩')

输出

kwargs参数的类型是:<class 'dict'>, 内容是:{'name': '小王', 'age': 11, 'gender': '男孩'}

在这个例子中,user_info 函数接受任意数量的关键字参数,传入的参数以字典的形式被存储在 kwargs 中。这种方式适合用于处理不确定数量的命名参数。

📄应用场景
  • 动态配置:在构建一个灵活的函数时,可以接受不确定的命名参数来配置函数行为。
  • 字典解包:在调用时使用 ** 可以将一个字典的键值对解包传入 **kwargs

📚3.3 位置不定长参数和关键字不定长参数的结合

*args**kwargs 可以在同一个函数中组合使用,来实现同时接收位置参数和关键字参数。需要注意的是,定义时 *args 必须出现在 **kwargs 之前。

示例

def user_info(description, *args, **kwargs):
    print(f"description: {description}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

user_info("User Details", 'Alice', 'Admin', age=30, country='USA')

输出

description: User Details
args: ('Alice', 'Admin')
kwargs: {'age': 30, 'country': 'USA'}

在这个例子中,user_info 接受了一个普通参数 description,然后接收任意数量的位置参数 *args,以及任意数量的关键字参数 **kwargs

📚3.4 使用 * 和 ** 解包参数

在调用函数时,我们可以使用 *** 将一个可迭代对象(如列表、字典)解包传入函数。例如:

def multiply(a, b, c):
    return a * b * c

# 使用列表解包
args = [2, 3, 4]
print(multiply(*args))  # 输出:24

# 使用字典解包
kwargs = {'a': 2, 'b': 3, 'c': 4}
print(multiply(**kwargs))  # 输出:24

在这个例子中,我们使用 *args**kwargs 将一个列表和字典解包传入函数,这种方法简化了参数传递。

📜总结

  • 位置不定长参数 \*args:将传入的多个位置参数打包成一个元组,适用于接收任意数量的位置参数。
  • 关键字不定长参数 \**kwargs:将传入的多个键值对参数打包成一个字典,适用于接收任意数量的关键字参数。
  • 结合使用:可以在同一个函数中使用 *args**kwargs 来同时接收任意数量的位置参数和关键字参数。
  • 解包参数:使用 *** 可以将列表或字典解包传入函数,简化调用。

不定长参数在编写通用函数时非常有用,可以大大提升函数的灵活性和扩展性。掌握 *args**kwargs 的使用,可以让你的代码更具适应性和重用性。

📖四、匿名函数lambda(只能支持一行代码)

在 Python 中,匿名函数(lambda 函数) 是一种简洁的函数定义方式。它使用 lambda 关键字来创建一个没有名字的函数,只能用于简单的单行表达式。lambda 表达式在需要一个简单的、临时的函数时非常有用,尤其是在其他函数的参数中。

📚4.1 lambda 表达式的语法

lambda 参数1, 参数2, ... : 表达式
  • lambda 关键字:用于定义匿名函数。
  • 参数:可以有一个或多个参数,多个参数之间用逗号分隔。
  • 表达式:lambda 函数的主体只能是一个表达式,不能包含多行代码或复杂逻辑。表达式的计算结果就是该函数的返回值。

示例:基本用法

以下是一个使用 lambda 函数的基本示例:

# lambda 表达式实现简单的加法
add = lambda a, b: a + b

# 调用 lambda 函数
print(add(2, 3))  # 输出:5

在这个例子中,add 是一个 lambda 表达式,接收两个参数 ab,返回它们的和。这个表达式相当于以下普通函数的简化写法:

def add(a, b):
    return a + b

📚4.2 使用 lambda 作为参数

lambda 表达式常用于传递一个简单函数作为参数。例如,假设我们有一个 test_func 函数,用于接收一个计算函数,并使用它计算两个数的结果:

def test_func(compute):
    result = compute(1, 2)
    print(f"结果是:{result}")

# 使用普通函数作为参数
def add(a, b):
    return a + b

test_func(add)

# 使用 lambda 表达式作为参数
test_func(lambda a, b: a + b)

输出:

结果是:3
结果是:3

在这个例子中,test_func 接收一个计算函数 compute 作为参数,然后使用该函数计算 12 的和。我们可以传递一个 lambda 表达式 lambda a, b: a + b,直接作为参数来代替普通函数 add

📚4.3 lambda 在排序中的应用

lambda 表达式常用于列表排序中的 key 参数,以指定排序规则。例如,按字典列表中的某个字段排序:

students = [
    {"name": "Alice", "age": 24},
    {"name": "Bob", "age": 19},
    {"name": "Charlie", "age": 22},
]

# 按年龄升序排序
sorted_students = sorted(students, key=lambda student: student["age"])
print(sorted_students)

输出:

[{'name': 'Bob', 'age': 19}, {'name': 'Charlie', 'age': 22}, {'name': 'Alice', 'age': 24}]

在这里,lambda student: student["age"] 用作 key 函数,告诉 sorted 函数根据每个学生的 age 进行排序。

📚4.4 lambda 表达式的常见应用场景

  1. 简化代码:在不需要多次使用的简单函数场景下,用 lambda 表达式可以减少代码量。
  2. 作为参数传递:lambda 表达式可以作为参数传递给其他函数,用于指定行为(例如在排序、过滤等操作中)。
  3. 结合 map、filter、reduce 等高阶函数使用:这些高阶函数经常需要传入简单的函数,lambda 表达式使得代码更加简洁。
📄示例:结合 mapfilterreduce 使用
复制代码from functools import reduce

# 使用 lambda 表达式和 map 进行平方计算
numbers = [1, 2, 3, 4]
squared = map(lambda x: x ** 2, numbers)
print(list(squared))  # 输出:[1, 4, 9, 16]

# 使用 lambda 表达式和 filter 筛选偶数
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))  # 输出:[2, 4]

# 使用 lambda 表达式和 reduce 求积
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出:24

在这些例子中:

  • map 使用 lambda 表达式计算列表中每个数的平方。
  • filter 使用 lambda 表达式筛选出偶数。
  • reduce 使用 lambda 表达式累乘列表中的所有数。

📚4.5 lambda 表达式的局限性

虽然 lambda 表达式很简洁,但它也有一些局限性:

  1. 只能包含一个表达式:lambda 表达式不能包含多行语句或复杂的逻辑。
  2. 没有函数名:由于 lambda 是匿名函数,难以调试和复用。
  3. 可读性差:如果 lambda 表达式太复杂,会影响代码的可读性。对于复杂逻辑,推荐使用常规函数定义。

📜总结

  • lambda 表达式 是一种定义简单、单行函数的方式,适合用于一些简单的函数场景。
  • 它可以作为参数传递给其他函数,提高代码的简洁性和灵活性。
  • 常见应用场景包括 mapfiltersorted 等高阶函数调用中。
  • 对于较复杂的逻辑,应该避免使用 lambda 表达式,以确保代码的可读性。

结语

通过本文的学习,你已经掌握了 Python 函数的众多进阶特性。多值返回让函数更具灵活性,多种参数传递形式为函数设计提供了更多可能,而不定长参数和 lambda 表达式则进一步提升了代码的简洁与效率。Python 的这些特性让编程变得更具表现力和灵活性。希望你能够在实际编程中灵活运用这些技巧,不断提升代码质量,让每一行代码都更加简洁、优雅且功能强大!
在这里插入图片描述

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!

在这里插入图片描述


http://www.kler.cn/a/428700.html

相关文章:

  • 11-27 周三 Postman自动解析响应查询可用节点数量
  • Python机器学习笔记(四、监督学习算法:朴素贝叶斯分类器和决策树)
  • 计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据
  • _pickle.UnpicklingError: STACK_GLOBAL requires str报错解决办法
  • 数字化编辑器震撼升级! 开启AI编写标准新篇章
  • ​‌Spring Boot中的@GetMapping注解可以用于处理HTTP GET请求,并且可以接收对象参数​,详细示例
  • 4. React 性能优化技巧:如何让你的应用更快
  • 使用 postman 传递 binary 类型的图片到后端接口遇到的坑
  • C#设计模式--策略模式(Strategy Pattern)
  • AIGC 与艺术创作:机遇
  • Python Flask Web框架快速入门
  • Docker Compose实战一( 轻松部署 Nginx)
  • TCP/IP 协议栈高效可靠的数据传输机制——以 Linux 4.19 内核为例
  • 19 设计模式之享元模式(电影院座位预定案例)
  • spring boot 配置文件加载的加载和使用
  • multiprocessing模块怎么使用?
  • 【MIT-OS6.S081作业1.3】Lab1-utilities primes
  • 基于php+mysql的旅游网站——记忆旅行 旅游分享 攻略分享 设计与实现 源码 配置 文档
  • Unity3D 热更新之HybridCLR方案
  • PT8M2102 触控型 8Bit MCU