Python 迭代器Iterator介绍
有勇气的牛排
33
Python
2025-07-30 22:17:10
1 前言
1.1 定义
- 迭代器是一个可以被逐个遍历(迭代)的对象。
- 必须实现 迭代器协议:
__iter__()
:返回迭代器对象自身。
__next__()
:返回容器的下一个元素,没有元素师抛出 StopIteration
。
- 迭代器是 惰性求值 的:数据在需要时才生成,不一次性存储内存。
1.2 特定
- 一次性:迭代器遍历一次后就不能后退,需要重新创建。
- 节省内存:不需要一次性存储所有元素。
- 状态保持:保存当前迭代位置。
2 基本案例
2.1 使用内置函数 iter()
创建迭代器
num_list = [1, 2, 3]
it = iter(num_list)
print(next(it))
print(next(it))
print(next(it))
print(next(it))

2.2 自定义迭代器类
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
for num in MyIterator([1, 2, 3, 4, 5]):
print(num)
3 常见场景
- 大数据读取(避免一次性加载到内存)
- 文件逐行读取
- 流式数据处理
<h2><a id="1__0"></a>1 前言</h2>
<h3><a id="11__2"></a>1.1 定义</h3>
<ul>
<li>迭代器是一个可以被<strong>逐个遍历</strong>(迭代)的对象。</li>
<li>必须实现 迭代器协议:
<ul>
<li><code>__iter__()</code>:返回迭代器对象自身。</li>
<li><code>__next__()</code>:返回容器的下一个元素,没有元素师抛出 <code>StopIteration</code>。</li>
</ul>
</li>
<li>迭代器是 <strong>惰性求值</strong> 的:数据在需要时才生成,不一次性存储内存。</li>
</ul>
<h3><a id="12__10"></a>1.2 特定</h3>
<ul>
<li>一次性:迭代器遍历一次后就不能后退,需要重新创建。</li>
<li>节省内存:不需要一次性存储所有元素。</li>
<li>状态保持:保存当前迭代位置。</li>
</ul>
<h2><a id="2__18"></a>2 基本案例</h2>
<h3><a id="21__iter__20"></a>2.1 使用内置函数 <code>iter()</code> 创建迭代器</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
num_list = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]
it = <span class="hljs-built_in">iter</span>(num_list) <span class="hljs-comment"># 转为迭代器对象</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(it)) <span class="hljs-comment"># 1</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(it)) <span class="hljs-comment"># 2</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(it)) <span class="hljs-comment"># 3</span>
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(it)) <span class="hljs-comment"># StopIteration</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/4f258f2649b2edacc50a9916eed5ad06.png" alt="image.png" /></p>
<h3><a id="22__36"></a>2.2 自定义迭代器类</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">MyIterator</span>:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, data</span>):
self.data = data
self.index = <span class="hljs-number">0</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__iter__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> self <span class="hljs-comment"># 返回迭代器对象本身</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__next__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">if</span> self.index >= <span class="hljs-built_in">len</span>(self.data):
<span class="hljs-keyword">raise</span> StopIteration
value = self.data[self.index]
self.index += <span class="hljs-number">1</span>
<span class="hljs-keyword">return</span> value
<span class="hljs-keyword">for</span> num <span class="hljs-keyword">in</span> MyIterator([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]):
<span class="hljs-built_in">print</span>(num)
</code></div></pre>
<h2><a id="3__61"></a>3 常见场景</h2>
<ul>
<li>大数据读取(避免一次性加载到内存)</li>
<li>文件逐行读取</li>
<li>流式数据处理</li>
</ul>
评论区