云南网站建设,企业信息化软件定制开发

专业提供昆明网站建设, 昆明软件开发, 云南网站建设,企业信息化软件定制开发服务免费咨询QQ932256355

博客园 首页 新随笔 联系 订阅 管理

Python 特殊方法:容器与序列操作进阶(二)

本文深入探讨 __iter____next____reversed____add____radd____mul____rmul____iadd____imul__ 以及切片操作相关方法。介绍如何实现迭代器、反向迭代、容器拼接和重复,以及切片的赋值和删除操作,让自定义容器具备更强大的序列操作能力。

_iter_ 和__next__方法:

实现迭代器协议,iter 返回一个迭代器对象,next 返回迭代的下一个元素,当没有更多元素时抛出 StopIteration 异常。例如,实现一个自定义迭代器,用于遍历一个范围内的数字:

class MyRange:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        value = self.current
        self.current += 1
        return value


my_range = MyRange(1, 5)
for num in my_range:
    print(num)

__reversed__方法:实现反转容器元素的顺序,支持 reversed() 函数。在自定义列表类中实现反向迭代:

class MyList:
    def __init__(self, data):
        self.data = data

    def __reversed__(self):
        return reversed(self.data)


my_list = MyList([1, 2, 3])
for num in reversed(my_list):
    print(num)

__add__和__radd__方法:

实现容器的拼接操作(+),radd 处理反向拼接。例如,在自定义列表类中实现拼接:

class MyList:
    def __init__(self, data):
        self.data = data

    def __add__(self, other):
        if isinstance(other, MyList):
            return MyList(self.data + other.data)
        return NotImplemented

    def __radd__(self, other):
        if isinstance(other, MyList):
            return MyList(other.data + self.data)
        return NotImplemented


list1 = MyList([1, 2])
list2 = MyList([3, 4])
result = list1 + list2
print(result.data)

__mul__和__rmul__方法:实现容器与整数的乘法操作(*),用于重复容器元素,rmul 处理反向乘法。比如自定义列表类实现乘法操作:

class MyList:
    def __init__(self, data):
        self.data = data

    def __mul__(self, other):
        if isinstance(other, int):
            return MyList(self.data * other)
        return NotImplemented

    def __rmul__(self, other):
        return self.__mul__(other)


my_list = MyList([1, 2])
result = my_list * 3
print(result.data)

__iadd__和__imul__方法:

实现就地拼接操作(+=)和就地乘法操作(*=)。以自定义列表类为例:

class MyList:
    def __init__(self, data):
        self.data = data

    def __iadd__(self, other):
        if isinstance(other, MyList):
            self.data.extend(other.data)
            return self
        return NotImplemented

    def __imul__(self, other):
        if isinstance(other, int):
            self.data *= other
            return self
        return NotImplemented


list1 = MyList([1, 2])
list2 = MyList([3, 4])
list1 += list2
print(list1.data)

list1 *= 2
print(list1.data)

切片操作相关方法:

Python 3 中通过 setitem 实现切片赋值操作,通过 delitem 实现切片删除操作。例如自定义列表类中的切片操作:

class MyList:
    def __init__(self, data):
        self.data = data

    def __setitem__(self, index, value):
        if isinstance(index, slice):
            start, stop, step = index.start, index.stop, index.step
            self.data[start:stop:step] = value
        else:
            self.data[index] = value

    def __delitem__(self, index):
        if isinstance(index, slice):
            start, stop, step = index.start, index.stop, index.step
            del self.data[start:stop:step]
        else:
            del self.data[index]


my_list = MyList([1, 2, 3, 4, 5])
my_list[1:3] = [10, 20]
print(my_list.data)

del my_list[2:4]
print(my_list.data)

参考资料:

参考 Python 官方文档中关于迭代器和序列操作的内容(https://docs.python.org/3/library/stdtypes.html#iterator-types ),结合 Tekin 的 Python 专栏中关于高级数据结构操作的文章(https://blog.csdn.net/tekin_cn/article/details/145798133),帮助读者掌握这些方法的实际应用,提升自定义容器的功能。

  • 总结:梳理容器与序列操作进阶方法的实现要点和应用场景,强调其对提升代码通用性和灵活性的作用。

  • TAG:Python、特殊方法、迭代器、序列拼接、切片操作

posted on 2025-03-03 15:10  TekinTian  阅读(16)  评论(0)    收藏  举报