Python 教程之变量(4)—— 打包和解包参数

简介: Python 教程之变量(4)—— 打包和解包参数

我们使用两个运算符 *(用于元组)和 **(用于字典)。

背景

考虑这样一种情况,我们有一个接收四个参数的函数。我们想调用这个函数,我们有一个大小为 4 的列表,其中包含函数的所有参数。如果我们只是将一个列表传递给函数,则调用不起作用。

# 一个演示打包和解包需求的 Python 程序
# 一个接受 4 个参数并打印它们的示例函数。
def fun(a, b, c, d):
  print(a, b, c, d)
# 驱动程序代码
my_list = [1, 2, 3, 4]
# 这不起作用
fun(my_list)

输出 :

TypeError: fun() takes exactly 4 arguments (1 given)

 

包我们可以使用 ***** 来解包列表,以便它的所有元素都可以作为不同的参数传递。

# 一个带有 4 个参数并打印的示例函数,
def fun(a, b, c, d):
  print(a, b, c, d)
# 驱动程序代码
my_list = [1, 2, 3, 4]
# 将列表解压缩为四个参数
fun(*my_list)

输出 :

(1, 2, 3, 4)

我们需要记住,参数的数量必须与我们为参数解包的列表的长度相同。

# 当 len(args) != 函数所需的实际参数没有时出错
args = [0, 1, 4, 9]
def func(a, b, c):
  return a + b + c
# 使用解包参数调用函数
func(*args)

输出:

Traceback (most recent call last):
  File "/home/592a8d2a568a0c12061950aa99d6dec3.py", line 10, in <module>
    func(*args)
TypeError: func() takes 3 positional arguments but 4 were given

作为另一个示例,考虑需要单独的开始和停止参数的内置 range() 函数。如果它们不能单独使用,请使用 *-operator 编写函数调用以将参数从列表或元组中解包出来:

>>>
>>> range(3, 6) # 带有单独参数的正常调用
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # 使用从列表中解包的参数调用
[3, 4, 5]

Packing 

当我们不知道需要将多少个参数传递给 python 函数时,我们可以使用 Packing 将所有参数打包到一个元组中。

# 演示打包使用的 Python 程序
# 此函数使用打包来汇总未知数量的参数
def mySum(*args):
  return sum(args)
# 驱动程序代码
print(mySum(1, 2, 3, 4, 5))
print(mySum(10, 20))

输出:

15 
30

上述函数 mySum() 执行“打包”以将此方法调用接收到的所有参数打包到一个变量中。一旦我们有了这个“打包”变量,我们就可以用它来做我们用普通元组做的事情。args[0] 和 args[1] 会分别给你第一个和第二个参数。由于我们的元组是不可变的,您可以将 args 元组转换为列表,以便您还可以修改、删除和重新排列 i 中的项目。


打包和拆包 

下面是一个显示打包和拆包的示例。

# 一个 Python 程序,用于演示打包和解包。
# 一个示例 python 函数,它接受三个参数并打印它们
def fun1(a, b, c):
  print(a, b, c)
# 另一个示例函数。
# 这是包装的一个例子。 传递给 fun2 的所有参数都打包到元组 *args 中。
def fun2(*args):
  # 将 args 元组转换为列表,以便我们修改它
  args = list(args)
  # 修改参数
  args[0] = 'Haiyong'
  args[1] = 'awesome'
  # 拆包参数并调用 fun1()
  fun1(*args)
# 驱动程序代码
fun2('Hello', 'beautiful', 'world!')

输出:

(Haiyong, awesome, world!)

用于字典

# 演示使用 ** 解包字典项的示例程序
def fun(a, b, c):
  print(a, b, c)
# 解包字典的调用
d = {'a':2, 'b':4, 'c':10}
fun(**d)

输出:

2 4 10

这里 ** 解压了与它一起使用的字典,并将字典中的项目作为关键字参数传递给函数。所以写“fun(1, **d)”就相当于写“fun(1, b=4, c=10)”。

# 一个 Python 程序,用于演示使用 ** 打包字典项
def fun(**kwargs):
  # kwargs 是一个字典
  print(type(kwargs))
  # 打印字典项目
  for key in kwargs:
    print("%s = %s" % (key, kwargs[key]))
# 驱动程序代码
fun(name="geeks", ID="101", language="Python")

输出

<class 'dict'>
name = geeks
ID = 101
language = Python

应用和要点

  1. 在套接字编程中用于向服务器发送大量请求。
  2. 在 Django 框架中用于将变量参数发送到视图函数。
  3. 有些包装函数需要我们传入可变参数。
  4. 参数的修改变得容易,但同时验证不正确,因此必须小心使用它们。


感谢大家的阅读,有什么问题的话可以在评论中告诉我。希望大家能够给我来个点赞+收藏+评论 ,你的支持是海海更新的动力!后面我会持续分享前端 & 后端相关的专业知识。


目录
相关文章
|
6月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
916 19
|
5月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
242 1
|
7月前
|
数据处理 开发工具 开发者
requirement.txt 管理python包依赖
在 Python 项目中,`requirements.txt` 用于记录依赖库及其版本,便于环境复现。本文介绍了多种生成该文件的方法:基础方法使用 `pip freeze`,进阶方法使用 `pipreqs`,专业方法使用 `poetry` 或 `pipenv`,以及手动维护方式。每种方法适用不同场景,涵盖从简单导出到复杂依赖管理,并提供常见问题的解决方案,帮助开发者高效生成精准的依赖列表,确保项目环境一致性。
2176 4
|
6月前
|
数据采集 存储 JSON
使用Python获取1688商品详情的教程
本教程介绍如何使用Python爬取1688商品详情信息,涵盖环境配置、代码编写、数据处理及合法合规注意事项,助你快速掌握商品数据抓取与保存技巧。
|
7月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
449 0
|
C++ Python
Python函数参数传递:传值还是传引用
Python函数参数传递:传值还是传引用
221 0
|
存储 Python
Python函数参数传递
Python函数参数传递
507 1
深入理解 Python 中的函数参数传递机制
在 Python 中,对于函数的参数传递,有两种主要的方式:传值和传引用。事实上,Python 的参数传递是一种“传对象引用”的方式。接下来的文章我们将详细介绍 Python 的函数参数传递机制,这对理解 Python 编程语言的底层实现以及优化你的代码都非常有帮助。
|
Python
python之函数的参数传递(引用传递和值传递),查看变量的内存地址的方法
python之函数的参数传递(引用传递和值传递),查看变量的内存地址的方法
220 0
|
存储 Python
Python中函数参数传递方法*args, **kwargs,还有其他
本文将讨论Python的函数参数。我们将了解*args和**kwargs,/和*的都是什么,虽然这个问题是一个基本的python问题,但是在我们写代码时会经常遇到,比如timm中就大量使用了这样的参数传递方式。
553 0

推荐镜像

更多