Python解构与封装
时间:2022-07-26
本文章向大家介绍Python解构与封装,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Python解构与封装
提出问题
先看以下代码
x = 1
y = 2
tmp = x
x = y
y = tmp
print(x, y)
代码的输出结果是:2 1
再看以下代码:
x = 1
y = 2
x, y = y, x
print(x, y)
代码的输出结果是:2 1
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
按照元素顺序,把线性结构lst的元素赋给变量first,second
加星号解构
In [11]: lst = list(range(5))
In [12]: head, *tail = lst
In [13]: head
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
In [17]: head
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
Python下划线的使用
使用单个下划线 _ 表示丢弃该变量,这是Python的一个惯例。单个下划线也是Python合法的标识符, 但是如果不是要丢弃一个变量,通常不要用单个下划线表示一个有意义的变量。可以理解为约定俗成。
解构与封装的使用
非常复杂的数据结构,多层嵌套的线性结构的时候,可以用解构快速提取其中的值,非常的便利
比如以下的使用方法
In [1]: key, _, value = 'I love Python'.partition(' love ')
In [2]: key
Out[2]: 'I'
In [3]: value
Out[3]: 'Python'
- ElasticSearch搜索引擎在SpringBoot中的实践
- 消费者驱动的微服务契约测试套件Spring Cloud Contract
- 使用Spring Boot开发一个Spring Mobile程序
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
- 内网穿透工具-ittun
- Elastic-Job-Spring-Boot-Starter简化你的任务配置
- Spring Boot处理REST API错误的正确姿势
- C语言之位运算
- C语言之预处理命令与用typedef命名已有类型
- spring-data-mongodb之MongoTemplate 删除操作
- 总结了一些指针易出错的常见问题(六)
- spring-data-mongodb之MongoTemplate 修改数据
- spring-data-mongodb之MongoTemplate 添加数据
- Cannot create a session after the response has been committed
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用OpenCV对运动员的姿势进行检测
- Redis入坟(三)Redis为什么这么快?
- Redis入坟(番外篇)配置文件redis.conf,解析每个参数的含义
- 使用OpenCV自动去除背景色
- Redis入坟(四)Redis内存回收知多少
- Redis入坟(五)持久化
- Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件
- Java程序员必须知道的常用序列化技术及选型,Protobuf 原理详解
- Python异步编程之 协程 & asyncio & 异步
- Redis入坟(八)内存管理与优化,面试必考
- 逐行阅读Spring5.X源码(十二)AOP源码分析,难!面试官都不一定懂!
- 逐行阅读Spring5.X源码(十三)spring事务源码分析
- 线程池ThreadPoolExecutor 源码分析,面试官也就那么回事,他怎么敢!
- Spug - 轻量级自动化运维平台
- Callable/Future 使用及原理分析,Future .get()为啥能等待呢?