附代码 什么是Python的迭代器和生成器?( 二 )


附代码 什么是Python的迭代器和生成器?

文章插图
 
完美!但等一下 , 我不是说迭代器也具有__iter __()方法吗?那是因为迭代器也是可迭代的 , 但反过来不成立 。它们是自己的迭代器 。让我通过遍历迭代器向你展示这个概念:
sample = ['data science', 'business analytics', 'machine learning']  it = sample.__iter__()  itit = it.__iter__()  print(type(itit))  print(itit.__next__())  print(itit.__next__())  print(itit.__next__())  
附代码 什么是Python的迭代器和生成器?

文章插图
 
酷!但我们可以使用iter()和next()来代替__iter__()和__next__()方法 , 它们提供了一种更简洁的方法:
sample = ['statistics', 'linear algebra', 'probability']    # iterator  it = iter(sample)    # next values  print(next(it))  print(next(it))  print(next(it))
附代码 什么是Python的迭代器和生成器?

文章插图
 
 
但如果我们超过了调用next()方法的限制次数 , 该怎么办?这会发生什么呢?
 print(next(it))  
附代码 什么是Python的迭代器和生成器?

文章插图
 
是的 , 我们得到了一个错误!如果我们在到达迭代器的末尾之后尝试访问下一个值 , 则会引起StopIteration异常 , 该异常的意思是“你不能更进一步了!” 。
我们可以使用异常处理来处理此错误 。实际上 , 我们可以自己构建一个循环来遍历可迭代的项:
sample = ['statistics', 'linear algebra', 'probability']  it = iter(sample)  while True:      # this will execute till an error is raised      try:          val = next(it)      # when we reach end of the list, error is raised and we break out of the loop      except StopIteration:          break      print(val) 
附代码 什么是Python的迭代器和生成器?

文章插图
 
如果你退后一步 , 你会意识到 , 这正是for循环在底层运行的方式 。我们在此处手动循环中所做的操作 , for循环会自动执行相同的操作 。这就是为什么for循环比遍历可迭代对象更可取 , 因为它们会自动处理异常 。
每当我们迭代一个可迭代对象时 , for循环通过iter()知道要迭代的项 , 并使用next()方法返回后续的项 。
在Python中创建一个迭代器既然我们知道了Python迭代器是如何工作的 , 我们可以更深入地研究并从头开始创建一个迭代器 , 以更好地了解其是如何凑效的 。
我将创建一个用于打印所有偶数的简单迭代器
class Sequence():      def __init__(self):          self.num = 2      def __iter__(self):          return self      def __next__(self):          val = self.num          self.num += 2          return val 让我们分解一下这段Python代码: