python的封包与解包

1. python 封包

将多个值赋值给一个变量时,python会自动将这些值封装成元组,这个特性称之为封包

a = 1, 2, 3
print(a, type(a))  # (1, 2, 3) <class 'tuple'>

当函数返回多个数值时,也会进行封包

def test():
    return 1, 2, 3

a = test()
print(a, type(a))  # (1, 2, 3) <class 'tuple'>

实践中,很少主动使用封包操作

2. python解包

python解包可以将元组解包成可变参数,将字典解包成关键字参数,下面列列举几种使用python解包的场景

2.1 接收函数返回值

def test():
    return 1, 2, 3

a, b, c = test()
print(a, b, c)      # 1 2 3

函数的返回值是一个元组,左侧是三个变量,这样就会发生解包,a, b, c依次等于元组里的元素,函数的返回值有3个,被封包成了元组, 赋值语句的左侧不一定非得是3个变量

def test():
    return 1, 2, 3

a, *b = test()
print(a, b)     # 1 [2, 3]

变量a赋值为1, 变量b前面有一个星号,剩余的2, 3 将被解包为列表

2.2 遍历字典

my_dic = {
    '一': 1,
    '二': 2,
    '三': 3
}

for item in my_dic.items():
    print(item)

# 解包
for key, value in my_dic.items():
    print(key, value)

2.3 传递参数

def func(*args):
    print(sum(args))


a = (2, 4, 6)
func(*a)    # 将元组解包成可变参数

def func_2(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

b = {'一': 1, '二': 2}
func_2(**b)     # 将字典解包成关键字参数

解包技术在实践中大量应用,比如使用python操作redis时,如果你想一次性向集合中添加多个值,就必须使用解包结束传入参数

import redis
from conf.redis_conf import RedisConfig, QueueConfig

r = redis.Redis(host=RedisConfig.host, port=RedisConfig.port,
                password=RedisConfig.password, db=RedisConfig.db)

tup = ('apple', '谷歌', '阿里', '腾讯')

r.sadd('my_set', *tup)

sadd的方法定义如下

def sadd(self, name, *values):
    "Add ``value(s)`` to set ``name``"
    return self.execute_command('SADD', name, *values)

如果不使用解包技术,就只能在调用sadd方法时手动逐个写入参数,耗时又费力

2.4 合并两个字典

巧妙的利用解包技术,可以简单方便的将两个字典合并到一个新字典中

dic_1 = {'一': 1}
dic_2 = {'二': 2}

dic_3 = {**dic_1, **dic_2}
print(dic_3)    # {'一': 1, '二': 2}

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案