1. 主页
  2. Python基础到高级
  3. 线性结构
  4. 解构与封装

解构与封装

解构

解构在Python中是非常不错的一个特性,被很多语言借鉴

解构实例

简单实例说明下解构使用场景:

x = 1
y = 2

tmp = x
x = y
y = tmp

print(x,y)

上面的执行操作获取到的结果:x = 2, y = 1,交换了变量值

还有别的方法,例如
x,y = y,x   结果集,就是将上面的结果还原了,这样背后的含义有解构也有封装

使用list来实现下解构环境

获取list的值的时候,需要使用索引一一来获取值,然后赋值给变量
>>> lst = [1, 2]
>>> first = lst[0]
>>> second = lst[1]

解构的形式赋值给变量
>>> first, seond = lst
>>> first
1
>>> seond
2

解构定义

按照顺序的把线性结构的元素赋值给变量

解构对应Python2的变化

在Python2中解构就这样结束了, 但是在Python3中,解构加入了一些更便利的操作。

1. 获取迭代对象的首尾元素。
>>> lst = list(range(5))
>>> lst
[0, 1, 2, 3, 4]
>>> head, *mid, tail = lst
>>> head   lst的首位元素 
0
>>> tail   lst最后一位元素
4
>>> mid   mid我们发现在前面有一个*号,表示获取除了首尾元素的其他元素
[1, 2, 3]

2. 获取首位元素和其他所有元素
>>> lst
[0, 1, 2, 3, 4]
>>> head, *mid = lst
>>> head   lst的首位元素
0
>>> mid   除了首位元素外的其他所有元素
[1, 2, 3, 4]

3. 获取最后一位元素,和之前的所有元素
>>> lst
[0, 1, 2, 3, 4]
>>> *mid, tail = lst
>>> mid   除了最后一位元素外的其他所有元素
[0, 1, 2, 3]
>>> tail   lst的最后一位元素
4

4. 丢弃中间的元素,只要首尾元素
在Python中有一个惯例,使用单个下划线 _ 表示丢弃该变量
>>> lst
[0, 1, 2, 3, 4]
>>> head, *_, tail = lst
>>> head
0
>>> tail
4
>>> _
[1, 2, 3]
这里我们看到 _ 还是有数据的,那是因为 单个下划线也是Python的合法标识符
但是如果不是要丢弃一个变量,通常不要用单个下划线表示一个有意义的变量

5. 多层次解构,多种表达方式
>>> lst = [1, (2,3), 5]
>>> lst
[1, (2, 3), 5]
>>> _, (_,val), *_ = lst
>>> val
3

>>> _, (*_,val), *_ = lst
>>> val
3

>>> _, [*_,val], *_ = lst
>>> val
3
获取下标为1的元组里面的下标为1的元素

不合法的规则

1. 左边只有一个带有'*'变量名的时候,是不合法的。
>>> *lst = lst
  File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple

2. 左边有多个带有 '*' 变量名的时候,是不合法的
>>> head, *m1, *m2, tail = lst
  File "<stdin>", line 1
SyntaxError: two starred expressions in assignment

3. 当左边的变量数超过右边元素个数的时候,是不合法的
>>> lst
[0, 1, 2, 3, 4]   当前list只有5个元素
>>> v1, v2, v3, v4, v5, v6 = lst   左边有6个变量名
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 6, got 5)

4. 左边变量数小于右边元素数,且左边没有加星号的变量时,是不合法的
>>> lst 
[0, 1, 2, 3, 4]   5个元素
>>> v1, v2 = lst    2个变量名
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

总结下

  • 元素按照顺序赋值给变量
  • 变量和元素必须匹配(左右两边的个数必须匹配)
  • 加星号的变量,可以接受任意个数的元素
  • 加星号的变量不能单独匹配
  • 左边只允许出现一个 ‘*’
  • 不管右边是什么数据,左边带星号的都是列表
  • 解构是支持多层次的

在非常复杂的数据结构,多层嵌套的线性结构的时候,可以用解构快速提取其中的值

封装

封装的例子

>>> t = 1,2
>>> t
(1, 2)

封装的定义

定义一个元组,可以省略小括号

例如,t1 = 1,2 和 t2 = (1,2) 是等效的。

封装出来的一定是元组

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注