前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
集合
- 集合:把不同元素组合在一起形成的一个数据集合
- 集合分为两种:可变集合(set),不可变集合(frozenset)
- 集合的内部结构和字典类似,但是不存储value,其中的元素也会进行hash运算,可以称的上是一个没有value的字典
- 集合中数据元素不能为可变数据对象
>>> myset = {[1,2,3]}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#可变数据对象不可hash,所以不能成为集合中数据元素
创建集合
- 可变集合
>>> myset = {1,2,3,4,5}
#直接通过大括号创建
>>> myset = set([1,2,3,1,2,3])
>>> myset
{1, 2, 3}
#通过工厂函数接收一个可迭代对象
- 不可变集合
>>> myset = frozenset([1,2,3,1,2,3])
>>> myset
frozenset({1, 2, 3})
访问集合
- 迭代访问集合
>>> myset = {1,2,3}
>>> for var in myset:
... print(var)
...
1
2
3
#集合虽然无序,但是可以通过for循环迭代访问
更新集合
- set.add():更新可hash数据类型到集合中,并维持数据类型
由于集合中的数据元素需要进行hash运算,可变数据类型是不可以进行hash运算的,也就不能传递进来被更新
>>> myset = {1,2}
>>> myset.add('abc') #更新字符串到集合中
>>> myset
{1, 2, 'abc'}
>>> myset.add((1,2,3)) #更新元组到集合中
>>> myset
{1, 2, 'abc', (1, 2, 3)}
>>> myset.add([1,2,3]) #更新列表到集合中报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
- set.update():如果传入的是一个序列,将被拆分成单个元素,并且去重
>>> myset = {1,2}
>>> myset.update('abc') #更新字符串
>>> myset
{1, 2, 'b', 'c', 'a'} #字符串被拆开
>>> myset.update([1,2,3]) #更新列表
>>> myset
{1, 2, 3, 'b', 'c', 'a'} #这里列表支持更新是因为存储的数据已经不再是列表,而是列表中的每一个实际数据
>>> myset.update((3,4,5)) #更新元组
>>> myset
{1, 2, 3, 4, 'b', 5, 'c', 'a'} #元组中的每一个数据都被拿出更新到集合中,并且去重
- 可变集合支持更新操作,不可变集合不支持更新操作
>>> myset = frozenset('abc')
>>> myset
frozenset({'a', 'b', 'c'})
>>> myset.add()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
#不可变集合不支持add更新
>>> myset.update()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'update'
#不可变集合不支持update更新
删除集合中的元素
- s.remove(obj):删除obj元素从集合s中
该函数在删除一个不存在的数据时会引发KeyError
>>> myset = {1,2,3}
>>> myset.remove(3)
>>> myset
{1, 2}
>>> myset.remove(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 5
- s.discard(obj) :如果obj是集合s中的元素,从集合s中删除对象obj
该函数在删除一个不存在的数据时不会报错
>>> myset = {1,2}
>>> myset.discard(1)
>>> myset
{2}
>>> myset = {1,2}
>>> myset.discard(3)
>>> myset
{1, 2}
- del myset:删除这个集合变量
>>> myset = {1,2,3}
>>> del myset
>>> myset
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'myset' is not defined
集合类型操作符
- in 和 not in可以判断某个元素是否在集合中
>>> myset = {1,2}
>>> 1 in myset
True
>>> 3 in myset
False
>>> 2 not in myset
False
- 子集和超集:
- a < b:a是否是b的子集a.issubset(b)
- a的元素b都有
- a > b:a是否是b的超集a.issuperset(b)
- 超集就代表a中的元素囊括了所有b的集合元素
- a < b:a是否是b的子集a.issubset(b)
>>> a = {1,2}
>>> b = {1,2,3,4}
>>> a < b
True
>>> a.issubset(b)
True
集合的交、并、补操作
- 联合:在a集合中和b集合去重数据元素,剩下的组合到一起返回一个新的集合
- 操作符:a | b
- 函数:a.union(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a | b
{1, 2, 3, 'c', 'b', 'a'}
- 交集:在a集合和b集合中,共同含有的集合成员去掉重复数据,组成到一起返回一个新的集合
- 操作符:a &b
- 函数:a.intersection(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a & b
{'a', 1}
- 差补:在a集合中去掉所有与b集合中相同的元素,只在a中保留b中没有的集合成员
- 操作符:a – b
- 函数:a.difference(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a - b
{2, 'b'}
- 对称差分:找出两个集合中,只属于集合a或集合b的元素;也就是去掉共有元素后,返回一个新的集合
- 操作符:a ^ b
- 函数:a.symmetric_differenc(b)
>>> a = {1,2,'a','b'}
>>> b = {1,3,'a','c'}
>>> a ^ b
{2, 3, 'b', 'c'}