1 封装与解构
封装与解构属于Python语言的一种特性,它使用起来很像其他语言中的"逗号表达式",但内部原理是不同的,在某些场景下:比如变量交换复制时使用,显得非常优雅。
1.1 封装
封装故名思议就是装箱,把多个值使用逗号分隔,组合在一起,本质上来看,其返回的是一个元组,只是省略了小括号。(一定要区别与C语言的逗号表达式)
![](https://img.haomeiwen.com/i13717038/ea4d25752c1bb3fc.png)
1.2 解构
解构,解构,就是把箱子解开,在Python中表示从线性结构中把元素解开,并且顺序的赋值给其他变量,需要注意的是,解构时接受元素的变量,需要放在等式的左边,并且数量要和右边解开的元素的个数一致。
![](https://img.haomeiwen.com/i13717038/c0841bc00e15f263.png)
1.3 Python3的解构
了解了封装与解构,那么回想一下当我们需要进行变量交换的时候,是否可以通过封装与解构进行优化呢?当我们在其他语言中进行a,b变量的值的交换,我们需要一个中间变量temp,即:a = temp,a = b,b = temp,在Python中我们可以省略。
![](https://img.haomeiwen.com/i13717038/25558a3abdf5dccc.png)
为什么可以使用这种骚操作,是因为Python在进行变量赋值时,会先计算等式右边的表达式,封装起来,然后再进行解构,赋给对应位置上的变量。并且还提供了其他更便捷的方法比如*号。
*号: 使用方式为: *变量名,贪婪的吸收解构的元素形成一个列表,无论能否吸收,都会返回一个列表。
_号:表示丢弃一个变量(实际上是使用_接受变量,但是使用这么一个符号,就表示我们不想用它)
![](https://img.haomeiwen.com/i13717038/c3ef560268e8e6fe.png)
需要注意的是:
*变量名,这种格式不能单独使用
也不能多个*变量名,连续使用(因为从原理上看,两个、*变量名连起来使用,会引起歧义,所以Python禁止了这种写法)
*_这种格式,可以收集足够多的元素丢弃
![](https://img.haomeiwen.com/i13717038/9a899d00f98b34ba.png)
解构是Python提供的很好的功能,可以方便的提取复杂的数据结构的值,配置_使用时,会更加便捷。
2 set类型
集合set在Python中是一个非常重要的非线性结构,它使用{}表示,用三个词总结集合的特点就是:可变的、无序的、不重复。它的官方解释如下:
set是一个无序的,不同的可hash对象组成的集。
常用来进行成员测试,在一个序列中去掉重复的对象,和进行数学上的计算,比如交集(intersection)、并集(union)、差集(difference)、对称差集(symmetric difference)等。
和其他容器类型相似,在一个无序的集合中支持x in set,len(set),for x in set等操作。
set不会记录元素的位置以及元素加入集合的顺序,所以set不支持索引,切片或者其他的类序列的操作。
什么是可hash对象,可以简单的理解为可以被hash()计算的对象,在Python中,可hash对象是不可变类型的,比如tuple, str, int, 等等。
2.1 set的定义
Python提供了两种定义一个集合的方式,set() 和 set(iterable),他们的用法如下:
![](https://img.haomeiwen.com/i13717038/5451eca9774c1766.png)
例如:
![](https://img.haomeiwen.com/i13717038/309f95a8fe138c3b.png)
2.2 set的基本操作
set是可变的类型,那就意味着,我们可以对set进行增加、删除、修改等操作。
2.2.1 增加元素
set提供了两种定义一个集合的方式,add 和 update,他们的用法如下:
![](https://img.haomeiwen.com/i13717038/79e0504dfb9e3bf8.png)
例
![](https://img.haomeiwen.com/i13717038/4d8f9c939baa0bc9.png)
2.2.2 删除元素
set提供了多种定义一个集合的方式,比如 remove ,pop,他们的用法如下:
![](https://img.haomeiwen.com/i13717038/a5c81ff1c9da9082.png)
例
![](https://img.haomeiwen.com/i13717038/33eff5c8b1c34108.png)
2.2.3 修改元素
上来我们需要先想一个问题,为什么要修改set呢?修改的本质是什么?
修改的本质其实就是找到这个元素,删除,然后在加入新的元素
由于集合是非线性结构,所以无法被索引
但是set是容器,可以被迭代
所以set不能像list那样,通过索引修改元素,因为它无序的特性,修改其实等同于删除、再添加而已。
2.2.4 成员判断
我们说既然set是容器,那么我们就可以对容器内的元素进行判断,那么就需要使用成员判断符 in 和 not in 了。
in: x in s, 判断元素x是否是在集合s中,返回bool类型
not in : x not in s, 判断元素x不在集合s中,返回bool类型
![](https://img.haomeiwen.com/i13717038/3438ef7b39396720.png)
我们知道在list,str这种线性结构中进行成员判断时,它的时间复杂度是O(n)的,因为需要遍历,但是在set中就很简单了,它只需要把要判断的元素进行hash,找到set中对应的门牌号,把里面的数据拽出来,看看是不是相同。 这种操作通常都是O(1)的,所以在set中,成员判断效率很高,当然在dict类型中,也是如此。
2.3 set小结
线性结构的查询时间复杂度是O(n),即随着数据规模的这不过大而增加耗时,set、dict等结构,内部使用的是hash值作为key,时间复杂度可以做到O(1)查询时间和数据规模无关,在python中可hash对象有(都属于不可变类型)
数值类型int、float、complex
布尔值True、False
字符串String、Bytes
元组tuple
None
3 集合
简单来说,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体。 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集。构成集合的事物或对象称作元素或是成员。集合的元素可以是任何事物,可以是人,可以是物,也可以是字母或数字等。 (此解释来自于维基百科)
全集:所有元素的结合。例如实数集,所有实数组成的集合就是实数集
子集subset和超集superset: 一个集合A所有的元素都在另一个集合B内,A是B的子集,B是A的超集
真子集和真超集:A是B的子集,且A不等于B,A就是B的真子集,B就是A的真超集
并集:多个集合合并的结果
交集:多个集合的公共部分
差集:集合中除去和其他集合共有的部分
这些是小学数学基础概念哦,兄弟们。
3.1 集合运算
通过集合运算,我们可以方便的对求出集合的差集、并集等,Python的集合除了提供了大量的集合运算方法还提供了不少的特殊符号用来表示集合运算。
3.2 并集
将集合A和集合B所有元素合并在一起,组成的集合称为集合A和集合B的并集
![](https://img.haomeiwen.com/i13717038/1cbc720ff4464fa9.png)
3.3 交集
集合A和集合B,由所有属于A且属于B的元素组成的集合
![](https://img.haomeiwen.com/i13717038/4b01fb0784cc388a.png)
3.3 差集
集合A和B,由所有属于A且不属于B的元素组成的集合。
![](https://img.haomeiwen.com/i13717038/34b86998828efa8f.png)
3.4 对称差集
不属于集合A和集合B交集的其他元素组成的集合,数学表达式为:(A-B) U (B-A)。
![](https://img.haomeiwen.com/i13717038/0e175c597f8867d2.png)
3.5 集合的其他运算
![](https://img.haomeiwen.com/i13717038/5a102f71acf7fb8a.png)
所有巧合的是要么是上天注定要么是一个人偷偷的在努力。
网友评论