Python - 解包的各种骚操作

简介: Python - 解包的各种骚操作

为什么要讲解包


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

 

啥是解包


  • 个人通俗理解:解开包袱,拿出东西
  • 正确理解:将元素从可迭代对象中一个个取出来
  • python 中,解包是自动完成的

 

最简单的解包栗子


a, b, c = [1, 2, 3]
print(a, b, c)
# 输出结果
1 2 3 


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

a, b = [1, 2, 3]



# 输出结果

   a, b = [1, 2, 3]

ValueError: too many values to unpack (expected 2)

太多值无法解包

 

重点

  • 除了列表可以解包,任何可迭代对象都支持解包
  • 比如:列表、元组、字典、集合、字符串、生成器,只要实现了 __next__ 方法的对象都是可迭代对象

 

可迭代对象详解

https://www.cnblogs.com/poloyy/p/14658433.html

 

各种解包栗子


元组解包

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

>>> a

1

>>> b

2

>>> c

3

 

字符串解包

>>> a,b,c = "abc"

>>> a

'a'

>>> b

'b'

>>> c

'c'

 

集合解包

>>> a,b,c = {1,2,3}

>>> a

1

>>> b

2

>>> c

3

 

字典解包

>>> a,b,c = {"a":1, "b":2, "c":3}

>>> a

'a'

>>> b

'b'

>>> c

'c'

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

 

多变量赋值

>>> a, b = 1, 2

>>> a

1

>>> b

2

  • 其实也是元组解包
  • 元组在 = 右边的时候,可以忽略 ( )

 

生成器解包

# 生成器

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

print(a, b, c)



# 输出结果

1 2 3

 

生成器详解文章

https://www.cnblogs.com/poloyy/p/14664538.html

 

解决变量数不等于右侧可迭代对象中元素的个数


上面提到了这个报错问题

a, b = [1, 2, 3]



# 输出结果

   a, b = [1, 2, 3]

ValueError: too many values to unpack (expected 2)

 

Python3 提供了解决方案

# 多变量

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

print(a, b, c)



# 输出结果

1 2 [3, 4, 5]

  • 在某个变量面前加一个星号
  • 而且这个星号可以放在任意变量
  • 每个变量都分配一个元素后,剩下的元素都分配给这个带星号的变量

# 多变量

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

print(a, b, c, d)



# 输出结果

1 2 [3, 4] 5

 

函数参数解包


主要是可变参数、关键字参数

详解文章:https://www.cnblogs.com/poloyy/p/12526592.html

 

函数详解文章:https://www.cnblogs.com/poloyy/p/15092393.html

 

解包小栗子一

# 函数

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

 

解包小栗子二

# 函数

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 3

 

Python 3.5+的新特性

  • 在 3.5 之前,函数调用时,一个函数中解包操作只允许一个 * 和一个 **
  • 3.5+ 之后,可以有任意多个解包

# 函数

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

 

在表达式中使用解包


栗子一

# 表达式解包

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}

 

栗子二:拼接列表

# 解包拼接列表

list1 = [1, 2]

list2 = range(3, 5)

list3 = [*list1, *list2]

print(list3)



# 输出结果

[1, 2, 3, 4]

list1 可以直接和 list2 做 + 操作吗?

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

 

栗子三:拼接两个字典

# 解包拼接字典

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://www.cnblogs.com/poloyy/p/12526592.html

相关文章
|
11天前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
108 47
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
8天前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
72 4
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
4月前
|
Python
下载python所有的包 国内地址
下载python所有的包 国内地址
|
12天前
|
程序员 Linux Python
python中模板和包的使用
本文介绍了 Python 模块和包的基本概念及使用方法。模块是 Python 程序结构的核心,每个以 `.py` 结尾的源文件都是一个模块,包含可重用的代码。文章详细讲解了模块的导入方式(如 `import` 和 `from...import`),模块的搜索顺序,以及如何创建和发布自己的模块。此外,还介绍了包的概念,包是包含多个模块的特殊目录,并通过 `__init__.py` 文件定义对外提供的模块列表。最后,文章简述了如何使用 `pip` 工具管理第三方模块的安装与卸载。作者:大石头的笔记;来源:稀土掘金。
|
1月前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
32 5
|
2月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
56 5