python的封包与解包
1. python 封包
将多个值赋值给一个变量时,python会自动将这些值封装成元组,这个特性称之为封包
a = 1, 2, 3 print(a, type(a))
|
当函数返回多个数值时,也会进行封包
def test(): return 1, 2, 3
a = test() print(a, type(a))
|
实践中,很少主动使用封包操作
2. python解包
python解包可以将元组解包成可变参数,将字典解包成关键字参数,下面列列举几种使用python解包的场景
2.1 接收函数返回值
def test(): return 1, 2, 3
a, b, c = test() print(a, b, c)
|
函数的返回值是一个元组,左侧是三个变量,这样就会发生解包,a, b, c依次等于元组里的元素,函数的返回值有3个,被封包成了元组, 赋值语句的左侧不一定非得是3个变量
def test(): return 1, 2, 3
a, *b = test() print(a, b)
|
变量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)
|