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

相关文章
WK
|
16天前
|
Python
如何在Python中导入包
在 Python 中,包是一种组织代码的方式,通过包含 `__init__.py` 文件(在 Python 3.3 及以上版本可选)的目录实现。包内可以包含多个模块(`.py` 文件)和其他子包。导入包有多种方式:整体导入包、导入特定模块、导入特定函数或类、导入子包等。推荐的做法是明确指定导入内容以提高代码的可读性和可维护性。此外,确保包目录结构正确,并将其添加到 Python 的搜索路径中。对于分发包,使用 setuptools 和 pip 等工具更为便捷。
WK
111 66
WK
|
16天前
|
Python
如何在Python中创建包
在Python中创建包十分简便,主要涉及目录结构的设置及`__init__.py`文件的配置。虽然Python 3.3后空`__init__.py`文件不再强制要求,但在特定场景下保留它有助于保持兼容性或执行包初始化代码。创建包的具体步骤包括:构建目录结构、编写模块代码、(可选)编写初始化代码等。例如,可以创建一个名为`mypackage`的目录,其中包含`__init__.py`及多个模块文件如
WK
107 62
WK
|
17天前
|
开发者 Python
Python中的包是什么?
在Python中,包是一种组织模块的方式,用于实现代码重用和模块化。通过包含`__init__.py`文件的目录定义包,形成树状结构,便于管理大型项目。包提高了代码的可读性和可维护性,允许重用现有代码,并避免模块名冲突。使用点操作符导入包中的模块,`__init__.py`可在包导入时执行初始化代码。从Python 3.3起,还可使用命名空间包来组织模块。掌握包的使用对大型Python项目开发至关重要。
WK
16 5
WK
|
17天前
|
开发工具 git Python
如何在Python中创建包?
在Python中创建包十分简便,主要步骤包括:创建目录(如 `mypackage`),并根据需求添加空的或含初始化代码的 `__init__.py` 文件;接着在该目录下添加 `.py` 文件作为模块;如有需要,可以进一步创建子包以形成层次结构。创建完成后,即可在其他脚本中导入并使用这些包。为避免名称冲突,请选择独特的包名,并考虑使用版本控制系统(如Git)管理代码变更。对于需分发的包,还应准备 `setup.py` 文件以方便构建与发布。
WK
16 3
|
19天前
|
项目管理 数据安全/隐私保护 Python
使用poetry来更优雅的管理 python 包
Poetry 的优势在于它提供了一个统一的工具来处理 Python 项目的整个生命周期,从依赖管理到打包和发布。它的依赖解析器非常强大,能够有效地处理复杂的依赖关系。此外,Poetry 还提供了一个直观的命令行界面,使得项目管理变得更加简单。 对于团队协作和项目部署来说,Poetry 的依赖锁定功能(通过 poetry.lock 文件)特别有用,因为它确保了所有环境中使用相同版本的依赖。
|
21天前
|
Python
【Azure 应用服务】如何为Web Jobs 安装Python包呢?
【Azure 应用服务】如何为Web Jobs 安装Python包呢?
【Azure 应用服务】如何为Web Jobs 安装Python包呢?
|
1月前
|
调度 数据库 UED
Python使用asyncio包实现异步编程方式
异步编程是一种编程范式,用于处理程序中需要等待异步操作完成后才能继续执行的情况。 异步编程允许程序在执行耗时的操作时不被阻塞,而是在等待操作完成时继续执行其他任务。 这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有用。
|
1月前
|
Python
手撕Python!模块、包、库,傻傻分不清?一分钟带你弄明白!
手撕Python!模块、包、库,傻傻分不清?一分钟带你弄明白!
41 1
|
1月前
|
PyTorch TensorFlow 算法框架/工具
手撕Python! 模块、包和库一分钟搞定!
手撕Python! 模块、包和库一分钟搞定!
21 1