📜  Python中的打包pack和拆包unpack参数

📅  最后修改于: 2020-01-13 11:53:05             🧑  作者: Mango

我们使用两个运算符*(用于元组)和**(用于字典)。
背景
考虑我们有一个接收四个参数的函数的情况。我们要调用此函数,并且我们有一个大小为4的列表,其中包含该函数的所有参数。如果我们只是将list传递给函数,则该调用将无法进行

# Python程序,展示如何打包和拆包
# 一个输入4个参数的简单函数
def fun(a, b, c, d):
    print(a, b, c, d)
# 创建list
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)
# 创建list
my_list = [1, 2, 3, 4]
# 拆包list并传入函数
fun(*my_list)

输出:

(1, 2, 3, 4)

再举一个例子,考虑内置的range()函数,它需要单独的start和stop参数。如果不能单独使用它们,请使用* 运算符编写函数调用,以将参数从列表或元组中拆包:

>>>
>>> range(3, 6)  # 普通的range写法
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)  # 通过拆包args的list进行range操作
[3, 4, 5]

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

# Python代码,展示打包操作
# 用打包操作,求未知个数的和
def mySum(*args):
    sum = 0
    for i in range(0, len(args)):
        sum = sum + args[i]
    return sum
# 测试我们的函数
print(mySum(1, 2, 3, 4, 5))
print(mySum(10, 20))

输出:

15
30

上面的函数mySum()进行“打包”操作,以将该方法调用接收的所有参数打包到一个变量中。一旦有了这个“打包”变量,我们就可以使用普通元组来处理它。args [0]和args [1]分别为您提供第一个和第二个参数。由于我们的元组是不可变的,因此您可以将args元组转换为列表,以便还可以修改,删除和重新排列i中的项目。
打包和拆包
下面是显示打包和拆包的示例。

# Python代码,展示打包和拆包
# fun1输入三个数,然后打印他们
def fun1(a, b, c):
    print(a, b, c)
# 打包例子,所有的参数,被利用元组进行打包*args
def fun2(*args):
    # 把元组的参数转变成list,这样我们可以对args修改
    args = list(args)
    # 修改args
    args[0] = '芒果文档'
    args[1] = '太棒了'
    # 使用fun1()拆包
    fun1(*args)
# Driver code
fun2('你好', '美丽的', '世界!')

输出:

(芒果文档, 太棒了, 世界!)

**用于字典

# Python展示使用字典dictionary拆包**
def fun(a, b, c):
    print(a, b, c)
# 调用字典的拆包
d = {'a':2, 'b':4, 'c':10}
fun(**d)

输出

2 4 10

在这里**拆包与字典一同使用,然后将字典中的key对应的值作为关键字参数传递给该函数。因此写“ fun(1,** d)”等效于写“ fun(1,b = 4,c = 10)”

# Python展示使用字典dictionary打包**
def fun(**kwargs):
    # kwargs是字典
    print(type(kwargs))
    # 打印字典的值
    for key in kwargs:
        print("%s = %s" % (key, kwargs[key]))
# 测试代码
fun(name="芒果", ID="168", language="Python")

输出:


language = Python
name = 芒果
ID = 168

应用程序和要点
1.在套接字编程中用于向服务器发送大量请求。
2.在Django框架中用于发送变量参数以查看函数。
3.有些包装函数要求我们传入变量参数。
4.修改参数变得容易,但同时验证也不正确,
因此必须谨慎使用。