0、什么是迭代器
迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据)
在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问
1、相关的BIF
iter()
将一个可迭代对象转换成一个迭代器
next()
访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常
2、魔法方法
__iter__(self)
返回迭代器本身
__next__(self)
决定迭代的方法
3、例题:
用while语句实现与下年for语句相同的功能
for each in range(5): print(each) alist = range(5) it = iter(alist) #----------------------------------- while True: try: print(next(it)) except StopIteration: break
写一个迭代器输出至今位置所有闰年
class LeapYear: def __init__(self): self.year_now=2018 def __iter__(self): return self def __next__(self): self.year_now-=1 if self.year_now % 4==0 and self.year_now%100!=0 or self.year_now%400==0: return self.year_now else: return self.__next__() leapYears = LeapYear() for i in leapYears: if i >=2000: print(i) else: break
import datetime as dt class LeapYear: def __init__(self): self.now = dt.date.today().year def isLeapYear(self, year): if (year%4 == 0 and year%100 != 0) or (year%400 == 0): return True else: return False def __iter__(self): return self def __next__(self): while not self.isLeapYear(self.now): self.now -= 1 temp = self.now self.now -= 1 return temp
写一个MyRev类功能与reserved()相同
class MyRev: def __init__(self,seq): self.seq=seq self.index=0 def __iter__(self): return self def __next__(self): self.index-=1 try: return self.seq[self.index] except IndexError: raise StopIteration myRev = MyRev("ABCDE") for i in myRev: print(i, end=‘‘)
class MyRev: def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index]