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、特殊方法、迭代器、序列拼接、切片操作
浙公网安备 33010602011771号