Python - 解包的各种骚操作

Python - 解包的各种骚操作

为什么要讲解包因为我觉得解包是 Python 的一大特性,大大提升了编程的效率,而且适用性很广

啥是解包个人通俗理解:解开包袱,拿出东西正确理解:将元素从可迭代对象中一个个取出来python 中,解包是自动完成的最简单的解包栗子代码语言:javascript复制a, b, c = [1, 2, 3]

print(a, b, c)

# 输出结果

1 2 3 列表有 3 个元素,此时也需要 3 个变量去接,否则会报错

代码语言:javascript复制a, b = [1, 2, 3]

# 输出结果

a, b = [1, 2, 3]

ValueError: too many values to unpack (expected 2)太多值无法解包

重点除了列表可以解包,任何可迭代对象都支持解包比如:列表、元组、字典、集合、字符串、生成器,只要实现了 __next__ 方法的对象都是可迭代对象可迭代对象详解https://cloud.tencent.com/developer/article/1814243

各种解包栗子元组解包代码语言:javascript复制>>> a,b,c = (1,2,3)

>>> a

1

>>> b

2

>>> c

3字符串解包代码语言:javascript复制>>> a,b,c = "abc"

>>> a

'a'

>>> b

'b'

>>> c

'c'集合解包代码语言:javascript复制>>> a,b,c = {1,2,3}

>>> a

1

>>> b

2

>>> c

3字典解包代码语言:javascript复制>>> a,b,c = {"a":1, "b":2, "c":3}

>>> a

'a'

>>> b

'b'

>>> c

'c'字典解包后,只会把字典的 key 取出来

多变量赋值代码语言:javascript复制>>> a, b = 1, 2

>>> a

1

>>> b

2其实也是元组解包元组在 = 右边的时候,可以忽略 ( )生成器解包代码语言:javascript复制# 生成器

a, b, c = (x + 1 for x in range(3))

print(a, b, c)

# 输出结果

1 2 3 生成器详解文章https://cloud.tencent.com/developer/article/1815053

解决变量数不等于右侧可迭代对象中元素的个数上面提到了这个报错问题

代码语言:javascript复制a, b = [1, 2, 3]

# 输出结果

a, b = [1, 2, 3]

ValueError: too many values to unpack (expected 2)Python3 提供了解决方案代码语言:javascript复制# 多变量

a, b, *c = [1, 2, 3, 4, 5]

print(a, b, c)

# 输出结果

1 2 [3, 4, 5]在某个变量面前加一个星号而且这个星号可以放在任意变量每个变量都分配一个元素后,剩下的元素都分配给这个带星号的变量代码语言:javascript复制# 多变量

a, b, *c, d = [1, 2, 3, 4, 5]

print(a, b, c, d)

# 输出结果

1 2 [3, 4] 5函数参数解包主要是可变参数、关键字参数

详解文章:https://cloud.tencent.com/developer/article/1640717

函数详解文章:https://cloud.tencent.com/developer/article/1857029

解包小栗子一代码语言:javascript复制# 函数

def test(a, b, c):

print(a, b, c)

# 正常逐个传参

test(1, 2, 3)

# 只传一个可迭代对象,就需要解包

test(*[1, 2, 3])

test(*{1, 2, 3})

test(*(1, 2, 3))

# 输出结果

1 2 3

1 2 3

1 2 3

1 2 3解包小栗子二代码语言:javascript复制# 函数

def test(a, b, c):

print(a, b, c)

# 关键字传参

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

# 只传一个可迭代对象,就需要解包,和上面写法是等价的

test(**{"a": 1, "b": 2, "c": 3})

# 输出结果

1 2 3

1 2 3Python 3.5+的新特性在 3.5 之前,函数调用时,一个函数中解包操作只允许一个 * 和一个 ** 3.5+ 之后,可以有任意多个解包代码语言:javascript复制# 函数

def test(a, b, c, d, e, f):

print(a, b, c, d, e, f)

test(*[1, 2, ], *[3, 4, ], **{"e": 5}, **{"f": 6})

# 输出结果

1 2 3 4 5 6在表达式中使用解包栗子一代码语言:javascript复制# 表达式解包

print(range(3), 3)

print(*range(3), 3)

print([*range(3), 3])

print({"a": 1, **{"b": 2, "c": 3}})

# 输出结果

range(0, 3) 3

0 1 2 3

[0, 1, 2, 3]

{'a': 1, 'b': 2, 'c': 3}栗子二:拼接列表代码语言:javascript复制# 解包拼接列表

list1 = [1, 2]

list2 = range(3, 5)

list3 = [*list1, *list2]

print(list3)

# 输出结果

[1, 2, 3, 4]list1 可以直接和 list2 做 + 操作吗?

不行,因为 list 无法与 range() 对象相加

栗子三:拼接两个字典代码语言:javascript复制# 解包拼接字典

dict1 = {"a": 1, "b": 2}

dict2 = {"name": "yy", "age": 22}

dict3 = {**dict1, **dict2}

print(dict3)

# 输出结果

{'a': 1, 'b': 2, 'name': 'yy', 'age': 22}解包总结自动解包支持一切可迭代对象函数调用时,可以用 * 或者 ** 解包可迭代对象拓展:Python 函数https://cloud.tencent.com/developer/article/1640717

相关推荐

芳华的解释及意思
det365娱乐场

芳华的解释及意思

📅 01-06 👁️ 627
精于制工品质 华硕龙骑士GTX970全解析
det365娱乐场

精于制工品质 华硕龙骑士GTX970全解析

📅 01-21 👁️ 1031
富人都有以下12个特征,你有几个呢?
beat365手机网址

富人都有以下12个特征,你有几个呢?

📅 01-20 👁️ 7788
蓝、金怪及BOSS地图分布
det365娱乐场

蓝、金怪及BOSS地图分布

📅 10-01 👁️ 829
什么是日志分析?
det365娱乐场

什么是日志分析?

📅 09-19 👁️ 5257
Shadowsocks vs V2Ray: 科学上网工具的选择与比较
det365娱乐场

Shadowsocks vs V2Ray: 科学上网工具的选择与比较

📅 10-04 👁️ 7164
唐朝最后是怎么灭亡的
det365娱乐场

唐朝最后是怎么灭亡的

📅 07-04 👁️ 1090
tnt礼包(tnt礼包领取教程)
365速发国际welcome

tnt礼包(tnt礼包领取教程)

📅 07-13 👁️ 2630
【坩】的拼音、怎么读
365速发国际welcome

【坩】的拼音、怎么读

📅 11-01 👁️ 5010