从迭代器到天生器:Python初学者指南

[复制链接]
发表于 2026-1-8 00:45:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
作为Python初学者,你大概已经打仗过列表、字符串等可迭代对象。但是你有没有想过,为什么我们可以直接在这些对象上利用for循环?本日,让我们一起深入相识Python的迭代器和天生器,看看它们是怎样工作的,以及怎样资助我们写出更优雅、高效的代码。
迭代器的概念

在Python中,迭代器是一个包罗有限或无穷个元素的对象,我们可以一次访问一个元素。最常见的迭代器就是列表、元组和字符串等。
让我们看一个简朴的例子:
  1. my_list = [1, 2, 3]
  2. for item in my_list:
  3.     print(item)
复制代码
这段代码可以正常运行,由于列表是可迭代的。但是,如果我们实行对整数举行迭代,会发生什么呢?
  1. my_int = 123
  2. for n in my_int:
  3.     print(n)
复制代码
运行这段代码,我们会得到一个TypeError:
  1. TypeError: 'int' object is not iterable
复制代码
这是由于整数不是可迭代对象。那么,什么样的对象才是可迭代的呢?
可迭代对象和__iter__方法

可迭代对象是实现了__iter__方法的对象。这个方法返回一个迭代器对象。我们可以利用hasattr()函数来查抄一个对象是否有__iter__方法:
  1. print(hasattr(my_str, '__iter__'))  # True
  2. print(hasattr(my_lst, '__iter__'))  # True
  3. print(hasattr(my_int, '__iter__'))  # False
复制代码
从输出结果我们可以看到,字符串和列表都是可迭代的,而整数不是。
迭代器协议

迭代器必须实现两个方法:

  • __iter__(): 返回迭代器对象自己。
  • __next__(): 返回下一个元素,如果没有更多元素则抛出StopIteration非常。
让我们实现一个简朴的迭代器:
  1. class MyRange:
  2.     def __init__(self, start, end):
  3.         self.current = start
  4.         self.end = end
  5.    
  6.     def __iter__(self):
  7.         return self
  8.    
  9.     def __next__(self):
  10.         if self.current < self.end:
  11.             result = self.current
  12.             self.current += 1
  13.             return result
  14.         raise StopIteration
  15. for i in MyRange(1, 4):
  16.     print(i)  # 输出: 1 2 3
复制代码
天生器:简化的迭代器

天生器是一种特别的迭代器,它利用yield关键字来天生值。天生器函数在每次调用时会停息并生存当前的全部状态,返回下一个值,并在下一次调用时从停息的地方继承实行。
这里有一个简朴的天生器示例:
  1. def my_range(start, end):
  2.     current = start
  3.     while current < end:
  4.         yield current
  5.         current += 1
  6. for i in my_range(1, 4):
  7.     print(i)  # 输出: 1 2 3
复制代码
天生器的优点是它们可以节流内存。比方,如果你须要处置惩罚一个很大的数据集,利用天生器可以制止一次性将全部数据加载到内存中。
总结

迭代器和天生器是Python中非常强大的工具,它们答应我们以一种内存高效的方式处置惩罚数据序列。作为初学者,明确这些概念将资助你写出更pythonic、更高效的代码。
记着:


  • 可迭代对象实现了__iter__方法
  • 迭代器实现了__iter__和__next__方法
  • 天生器是一种特别的迭代器,利用yield关键字天生值
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表