解锁函数的魔力: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 + btest_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.rhkb.cn/news/467694.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依框架-添加测试类-最新

1、在【ruoyi-admin】的pom.xml下添加依赖 <!-- 单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><scope>test</scope></dependency><dependency>…

初识网络编程TCP/IP

目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程&#xff0c;会出现一堆协议、概念、这层次那技术的&#xff0c;头都大了&#xff0c;还是得总结总结…… 相关名词解释 ✨✨网络…

【C++课程学习】:继承(上)(详细讲解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.继承的概念和定义 &#x1f384;继承的概念&#xff1a; &#x1f384;继承的定义&#xff1a; …

Linux笔记之pandoc实现各种文档格式间的相互转换

Linux笔记之pandoc实现各种文档格式间的相互转换 code review! 文章目录 Linux笔记之pandoc实现各种文档格式间的相互转换1.安装 Pandoc2.Word转Markdown3.markdown转html4.Pandoc 支持的一些常见格式4.1.输入格式4.2.输出格式 1.安装 Pandoc sudo apt-get install pandoc # …

封装的数字滚动组件的实现代码

效果&#xff1a; 学习啦&#xff1a; Vue 是一个渐进式框架&#xff0c;鼓励通过组件化来构建应用&#xff0c;其组件化优势&#xff1a; 代码复用&#xff1a;不同的视图和功能被封装成独立的组件&#xff0c;便于复用。易于维护&#xff1a;每个组件职责单一、耦合度低&…

Kafka面试题解答(二)

1.怎么尽可能保证 Kafka 的可靠性 kafka是可能会出现数据丢失问题的&#xff0c;Leader维护了一个动态的in-sync replica set&#xff08;ISR&#xff09;&#xff0c;意为和 Leader保持同步的FollowerLeader集合(leader&#xff1a;0&#xff0c;isr:0,1,2)。 如果Follower长…

分块——最为优雅的暴力

在信息学竞赛中&#xff0c;常常会遇到一些区间修改或区间查询的题目&#xff0c;如果直接敲暴力的话&#xff0c;时间复杂度是 O ( n m ) O(nm) O(nm) 可能会超时&#xff0c;如果写树状数组或线段树的话&#xff0c;又有一点复杂&#xff0c;不易理解&#xff0c;那么这时候…

w~视觉~合集20~SAM

我自己的原文哦~ https://blog.51cto.com/whaosoft/12500982 #SAM 今天&#xff0c;Meta发布史上首个图像分割基础模型SAM&#xff0c;将NLP领域的prompt范式引进CV&#xff0c;让模型可以通过prompt一键抠图。网友直呼&#xff1a;CV不存在了! 就在刚刚&#xff0c;Meta AI…

Halcon resistor.hedv 使用多个对焦级别提取深度

depth_from_focus * Extract depth using multiple focus levels * 使用多个对焦级别提取深度 Names : [] * 初始化一个空数组&#xff0c;用于存储图像名称 dev_close_window () * 关闭当前打开的图像窗口 for i : 1 to 10 by 1 * 循环开始&#xff0c;从1到10 …

qt QTreeWidgetItem详解

1、概述 QTreeWidgetItem 是 Qt 框架中的一个类&#xff0c;专门用于在 QTreeWidget&#xff08;一个基于项的树形视图&#xff09;中表示单个节点&#xff08;或称为项&#xff09;。QTreeWidget 继承自 QAbstractItemView&#xff0c;而 QTreeWidgetItem 则作为树中的一个节…

三.Linux用户和用户管理

前言&#xff1a;Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用资源的都必须向系统管理员申请一个账户&#xff0c;然后通过这个账户的身份进入系统。 一.此次目的 用户账号的添加、删除与修改。 用户口令的管理。 用户组的管理。 二.用户账号的添加…

SpringBoot技术栈:构建高效共享汽车系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【笔记】扩散模型(九):Imagen 理论与实现

论文链接&#xff1a;Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现&#xff1a;lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作&#xff0c;这个工作并没有沿用 Stable Diffusion 的架构&#xff0c;而是级…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页&#xff0c;为什么我们还要学css&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;也叫层叠样式表&#xff0c;是负责美化的&#xff0c;我们之前说html就是一个骨架&#xff0c;css就可以用来美化网…

[全网最细数据结构完整版]第七篇:3分钟带你吃透队列

目录 1->队列的概念及结构 2->队列的实现 2.1定义队列基本结构 struct QueueNode 和 struct Queue 2.2队列初始化函数 QueueInit 函数 2.3队列销毁函数 QueueDestroy 函数 2.4队列插入数据函数 QueuePush 函数 2.5判断队列是否为空,空返回true,非空返回false 2.6队列删…

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗&#xff0c;每个弹窗是否弹出都有自己的策略&#xff0c;以及哪个优先弹出&#xff0c;哪个在上一个关闭后再弹出&#xff0c;为了更好管理&#xff0c;于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计&#xff0c;控制优先级及弹…

掌握软件组件/单元测试中的这些术语,你就算正式入门了

上篇干货&#xff0c;和大家分享了软件测试的几个级别&#xff0c;在【组件/单元测试】当中&#xff0c;涉及不少名词术语。从之前的学员学习过程来看&#xff0c;这里比较容易出现概念混乱&#xff0c;进而导致面试过程中频频翻车&#xff0c;所以有必要在这里单独拎出来和大家…

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日) <input type"week" id"week" class"my-css" value"ViewBag.DefaultWeek" /><script> function PageList() { var dateStrin…

【主机游戏】艾尔登法环游戏攻略

艾尔登法环&#xff0c;作为一款备受好评但优化问题频发的游戏&#xff0c;就连马斯克都夸过 今天介绍一下这款游戏 https://pan.quark.cn/s/24760186ac0b 角色升级 在《艾尔登法环》中&#xff0c;角色升级需要找到梅琳娜。你可以在关卡前废墟的营地附近&#xff0c;风暴关…

CSS 中三角形的绘制方法详解

在网页设计领域&#xff0c;特殊形状常常能为页面增添独特的视觉效果&#xff0c;三角形便是其中之一。本文将详细介绍如何利用 CSS 绘制三角形。 一、原理阐述 CSS 中一个元素的边框分为上边框、右边框、下边框和左边框。当把一个元素的宽度和高度设为 0&#xff0c;且只让其…