马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
作为Python初学者,你大概已经打仗过列表、字符串等可迭代对象。但是你有没有想过,为什么我们可以直接在这些对象上利用for循环?本日,让我们一起深入相识Python的迭代器和天生器,看看它们是怎样工作的,以及怎样资助我们写出更优雅、高效的代码。
迭代器的概念
在Python中,迭代器是一个包罗有限或无穷个元素的对象,我们可以一次访问一个元素。最常见的迭代器就是列表、元组和字符串等。
让我们看一个简朴的例子:
- my_list = [1, 2, 3]
- for item in my_list:
- print(item)
复制代码 这段代码可以正常运行,由于列表是可迭代的。但是,如果我们实行对整数举行迭代,会发生什么呢?
- my_int = 123
- for n in my_int:
- print(n)
复制代码 运行这段代码,我们会得到一个TypeError:
- TypeError: 'int' object is not iterable
复制代码 这是由于整数不是可迭代对象。那么,什么样的对象才是可迭代的呢?
可迭代对象和__iter__方法
可迭代对象是实现了__iter__方法的对象。这个方法返回一个迭代器对象。我们可以利用hasattr()函数来查抄一个对象是否有__iter__方法:
- print(hasattr(my_str, '__iter__')) # True
- print(hasattr(my_lst, '__iter__')) # True
- print(hasattr(my_int, '__iter__')) # False
复制代码 从输出结果我们可以看到,字符串和列表都是可迭代的,而整数不是。
迭代器协议
迭代器必须实现两个方法:
- __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:
- result = self.current
- self.current += 1
- return result
- raise StopIteration
- for i in MyRange(1, 4):
- print(i) # 输出: 1 2 3
复制代码 天生器:简化的迭代器
天生器是一种特别的迭代器,它利用yield关键字来天生值。天生器函数在每次调用时会停息并生存当前的全部状态,返回下一个值,并在下一次调用时从停息的地方继承实行。
这里有一个简朴的天生器示例:
- def my_range(start, end):
- current = start
- while current < end:
- yield current
- current += 1
- for i in my_range(1, 4):
- print(i) # 输出: 1 2 3
复制代码 天生器的优点是它们可以节流内存。比方,如果你须要处置惩罚一个很大的数据集,利用天生器可以制止一次性将全部数据加载到内存中。
总结
迭代器和天生器是Python中非常强大的工具,它们答应我们以一种内存高效的方式处置惩罚数据序列。作为初学者,明确这些概念将资助你写出更pythonic、更高效的代码。
记着:
- 可迭代对象实现了__iter__方法
- 迭代器实现了__iter__和__next__方法
- 天生器是一种特别的迭代器,利用yield关键字天生值
|