# Python解构与封装

## 提出问题

```x = 1
y = 2

tmp = x
x = y
y = tmp

print(x, y)```

```x = 1
y = 2

x, y = y, x
print(x, y)```

`x, y = y, x`这段代码背后的含义就是解构和封装

## Python封装

```In [1]: t = 1, 2

In [2]: t
Out[2]: (1, 2)

In [3]: type(t)
Out[3]: tuple			# 定义元组是可以省略小括号的

In [4]: t1 = (1, 2)

In [5]: t2 = 1, 2
# t1和t2等效
In [6]: t1
Out[6]: (1, 2)

In [7]: t2
Out[7]: (1, 2)```

`x, y = y, x`这段代码的右侧就会封装成(y, x)

## Python解构

### 基本解构

```In [8]: lst = [1, 2]

In [9]: first, second = lst

In [10]: print(first, second)
1 2```

### 加星号解构

```In [11]: lst = list(range(5))

In [12]: head, *tail = lst

Out[13]: 0

In [14]: tail
Out[14]: [1, 2, 3, 4]

In [15]: *lst2 = lst	# 左边必须有一个加星号的变量
File "<ipython-input-15-98211a44ccfb>", line 1
*lst2 = lst
^
SyntaxError: starred assignment target must be in a list or tuple

In [16]: *head, tail = lst

Out[17]: [0, 1, 2, 3]

In [18]: lst
Out[18]: [0, 1, 2, 3, 4]

In [19]: tail
Out[19]: 4

In [20]: head, *m1, *m2, tail = lst		# 星号不能有多个只能有一个
File "<ipython-input-20-1fc1a52caa8e>", line 1
head, *m1, *m2, tail = lst
^
SyntaxError: two starred expressions in assignment

In [21]: v1, v2, v3, v4, v5, v6, v7 = lst	# 左边变量数不能超过右边元素数
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-9366cfb498a1> in <module>()
----> 1 v1, v2, v3, v4, v5, v6, v7 = lst

ValueError: not enough values to unpack (expected 7, got 5)

In [22]: v1, v2 = lst						#左边变量数不能少于右边元素数
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-22-d7b0a4e7871e> in <module>()
----> 1 v1, v2 = lst

ValueError: too many values to unpack (expected 2)```

• 元素按照顺序赋值给变量
• 变量和元素必须匹配
• 加星号变量，可以接受任意个数的元素
• 加星号的变量不能单独出现

### 多层次解构

```In [23]: lst = [1, (2, 3), 5]

In [24]: _, v, *_ = lst		# v解析成(2, 3)

In [25]: v
Out[25]: (2, 3)

In [26]: _, val = v			# v可以进一步解构

In [27]: val
Out[27]: 3

In [28]: _, (_, val), *_ = lst		# 可以一步一次性解构

In [29]: val
Out[29]: 3

In [30]: _, [*_, val], *_ = lst		# 中间部分解构成列表

In [31]: val
Out[31]: 3

In [32]: _, _, val, *_ = lst		# (2, 3)解析成第二个_

In [33]: val
Out[33]: 5```

### 解构与封装的使用

```In [1]: key, _, value = 'I love Python'.partition(' love ')

In [2]: key
Out[2]: 'I'

In [3]: value
Out[3]: 'Python'```

0 条评论

• ### Python基本数据类型-list-tuple-dict-set

输出结果：0 1 2 3 4 5 6 7 [0, 1, 3, 4, 5, 6, 7]

• ### Python IO

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, clo...

• ### Python函数

位置可变参数可以在普通参数之前， 但是在位置可变参数之后的普通参数变成了keyword-only参数:

• ### Python 具名元组——我不只是可不变列表

很多 Python 入门资料会将元组 ( tuple) 介绍为 "不可变列表", 因其具备可迭代和可切片的能力, 同时无法修改元组中的值而得名. 然而这只是元组...

• ### python基础教程：基本数据类型

计算机的本质就是计算，在其内部是0和1的比特位的变化，对外表现就是数据的变化。那么，计算机都能处理什么数据呢？本质上，数据都是以字节（Byte）存储的，表现上看...

• ### python3之list列表

list的用法（列表）

• ### python中的scipy模块

版权声明：本文为博主原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接和本声明。

• ### 《利用Python进行数据分析·第2版》第8章 数据规整：聚合、合并和重塑8.1 层次化索引8.2 合并数据集8.3 重塑和轴向旋转8.4 总结

在许多应用中，数据可能分散在许多文件或数据库中，存储的形式也不利于分析。本章关注可以聚合、合并、重塑数据的方法。 首先，我会介绍pandas的层次化索引，它广泛...

• ### 《利用Python进行数据分析·第2版》第2章 Python语法基础，IPython和Jupyter Notebooks2.1 Python解释器2.2 IPython基础2.3 Python语法基础

当我在2011年和2012年写作本书的第一版时，可用的学习Python数据分析的资源很少。这部分上是一个鸡和蛋的问题：我们现在使用的库，比如pandas、sci...