1)序列类型的分类:
容器序列 list tuple deque
扁平序列 str bytes bytearray array.array
可变序列 list deque bytearray array
不可变序列 str tuple bytes
2)序列中+ ;+= extend的区别:
+与+=的区别,我们可以看下一下运行的代码
list = [1,2,3,4]
list2 = list + [5,6,7]
print(list2)
------------------------------------
[1, 2, 3, 4, 5, 6, 7]
list = [1,2,3,4]
list += [5,6,7]
print(list)
-------------------------------------
[1, 2, 3, 4, 5, 6, 7]
list = [1,2,3,4]
list2 = list + (5,6,7)
print(list2)
-------------------------------------
Traceback (most recent call last):
File "E:\code\test.py", line 49, in <module>
list2 = list + (5,6,7)
TypeError: can only concatenate list (not "tuple") to list
list = [1,2,3,4]
list += (5,6,7)
print(list)
---------------------------------------
[1, 2, 3, 4, 5, 6, 7]
可以看到+两边的序列类型要一致
+=是在原序列上操作而且不要求序列类型一致。
+=的实现是通过collections的abc模块中,MutableSequence类中的 def iadd(self, values)方法实现的,实际是用extend来实现的,extend内部是for循环实现的,下面是MutableSequence类中的代码片段。
def __iadd__(self, values):
self.extend(values)
return self
def extend(self, values):
'S.extend(iterable) -- extend sequence by appending elements from the iterable'
if values is self:
values = list(values)
for v in values:
self.append(v)
可切片对象的实现:
实现可切片对象只要实现abc模块里面的Sequence类中的抽象方法就行
下面是Sequence类代码
class Sequence(Reversible, Collection):
"""All the operations on a read-only sequence.
Concrete subclasses must override __new__ or __init__,
__getitem__, and __len__.
"""
__slots__ = ()
@abstractmethod
def __getitem__(self, index):
raise IndexError
def __iter__(self):
i = 0
try:
while True:
v = self[i]
yield v
i += 1
except IndexError:
return
def __contains__(self, value):
for v in self:
if v is value or v == value:
return True
return False
def __reversed__(self):
for i in reversed(range(len(self))):
yield self[i]