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

举报
海拥 发表于 2023/03/29 00:05:20 2023/03/29
【摘要】 我们使用两个运算符 *(用于元组)和 **(用于字典)。\背景 考虑这样一种情况,我们有一个接收四个参数的函数。我们想调用这个函数,我们有一个大小为 4 的列表,其中包含函数的所有参数。如果我们只是将一个列表传递给函数,则调用不起作用。# 一个演示打包和解包需求的 Python 程序# 一个接受 4 个参数并打印它们的示例函数。def fun(a, b, c, d): print(a, b,...

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

背景 
考虑这样一种情况,我们有一个接收四个参数的函数。我们想调用这个函数,我们有一个大小为 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. 参数的修改变得容易,但同时验证不正确,因此必须小心使用它们。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。