这里主要纠正迭代器的用法,因为一些教程传播错误示例让我很无语。
最大的错误就是,把__iter__和__next写在同个类里,每每看见都感到诧异。不是说这方法不行,主要是,一旦出现预期之外的运行结果往往很难查到原因(因为它压根不是报错,也不是运行异常)。
0、先附上两个类Vector_Right和Vector_Wrong:
class Vector_Right:#有迭代器类class __Iter:def __init__(self,lst):self.__lst=lstself.__pst=0def __next__(self):if(self.__pst>=len(self.__lst)):raise StopIterationelse:val=self.__lst[self.__pst]self.__pst+=1return valdef __init__(self,lst):self.__lst=list(lst) if lst else []def __iter__(self):#返回迭代器return self.__Iter(self.__lst)
class Vector_Wrong:#没有迭代器def __init__(self,lst):self.__lst=list(lst) if lst else []def __iter__(self):#自己就是迭代器(黑人问号)self.__pst=0return selfdef __next__(self):if(self.__pst>=len(self.__lst)):raise StopIterationelse:val=self.__lst[self.__pst]self.__pst+=1return val
1、首先,先来个简单的多线程:
from threading import Thread
from time import sleep
from random import randintdef Traversal(vector,func,rst):for i in vector:rst.append(func(i))sleep(randint(1,10)/1000)for Vector in [Vector_Right,Vector_Wrong]:vector=Vector(range(26))rst=[[],[]]th_1=Thread(target=lambda:Traversal(vector,lambda val:chr(ord('a')+val),rst[0]))#两条线程同时遍历vectorth_2=Thread(target=lambda:Traversal(vector,lambda val:chr(ord('A')+val),rst[1]))th_1.start()th_2.start()th_1.join()th_2.join()print(Vector)for lst in rst:print(lst)print()
2、然后,再来个多层遍历同对象的操作:
for Vector in [Vector_Right,Vector_Wrong]:print(Vector)vector=Vector(range(3))for x in vector:for y in vector:print(x,y)print()
3、结论:
以上结果都说明,Vector_Wrong未能顺利遍历,这就是把自身作为迭代器返回的弊端,因为无法保证同一时间内同个容器只有一个迭代器在使用。
而且对于Python原生的容器list、dict、str、set、tuple等,它们都没把__next__写在容器类里而是写在迭代器类中:
本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/132769946
未经个人同意不得私自转载。