4.python自定义序列

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]

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值