news 2026/2/15 20:24:57

一文搞懂Python迭代器和生成器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞懂Python迭代器和生成器

很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系?

这篇文章就是要用最简单的方式让你理解Python迭代器和生成器!

迭代器和迭代过程

维基百科解释道:

在Python中,迭代器是遵循迭代协议的对象。使用iter()从任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一种形式的输入迭代器是generator(生成器)。

很多容器诸如列表、字符串可以用for循环遍历对象。

for语句会调用容器对象中的iter()函数, 该函数返回一个定义了__next__()方法的迭代器对象,该方法将逐一访问容器中的元素。

所以说:

python中,任意对象,只要定义了__next__方法,它就是一个迭代器。

因此,python中的容器如列表、元组、字典、集合、字符串都可以被称作迭代器。

讲完迭代器后,迭代就比较好理解了,迭代就是从迭代器中取元素的过程

比如我们用for循环从列表[1,2,3]中取元素,这种遍历过程就被称作迭代

# 列表是迭代器for element in [1, 2, 3]:print(element)# 元组是迭代器for element in (1, 2, 3):print(element)# 字典是迭代器for key in {'one':1, 'two':2}:print(key)# 字符串是迭代器for char in "123":print(char)# 打开的text同样是迭代器for line in open("myfile.txt"):print(line, end='')

如果你不想用for循环迭代呢?

这时你可以:

  1. 先调用容器(以字符串为例)的iter()函数

  2. 再使用next()内置函数来调用__next__()方法

  3. 当元素用尽时,__next__()将引发 StopIteration 异常

>>> s = 'abc'>>> it = iter(s)>>> it<iterator object at 0x00A1DB50>>>> next(it)'a'>>> next(it)'b'>>> next(it)'c'>>> next(it)Traceback (most recent call last):File "<stdin>", line 1, in <module>next(it)StopIteration

生成器 Generator

看看廖雪峰大神的解释:

通过列表生成式,我们可以直接创建一个列表。

但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?

这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

生成器也是一种迭代器,但是你只能对其迭代一次。

这是因为它们并没有把所有的值存在内存中,而是在运行时生成值

你通过遍历来使用它们,要么用一个for循环,要么将它们传递给任意可以进行迭代的函数和结构。

大多数时候生成器是以函数来实现的。然而,它们并不返回一个值,而是yield(暂且译作“生出”)一个值。

每次对生成器调用next()时,它会从上次离开位置恢复执行(它会记住上次执行语句时的所有数据值)。显示如何非常容易地创建生成器的示例如下:

def reverse(data):for index in range(len(data)-1, -1, -1):yield data[index]

    >>> for char in reverse('golf'):... print(char)...flog

    可以用生成器来完成的操作同样可以用前一节所描述的基于类的迭代器来完成。但生成器的写法更为紧凑,因为它会自动建__iter__()__next__()方法。

    生成器表达式

    生成器不一定要用复杂的函数表示,python提供了简洁的生成器表达式。

    从形式上来看,生成器表达式和列表推导式很像,仅仅是将列表推导式中的[]替换为(),但是两者差别挺大,生成器表达式可以说组合了迭代功能和列表解析功能。

    生成器表达式可以认为是一种特殊的生成器函数,类似于lambda表达式和普通函数。但是和生成器一样,生成器表达式也是返回生成器generator对象,一次只返回一个值

    >>> sum(i*i for i in range(10)) # sum of squares285
    >>> xvec = [10, 20, 30]>>> yvec = [7, 5, 3]>>> sum(x*y for x,y in zip(xvec, yvec)) # dot product260
    >>> from math import pi, sin>>> sine_table = {x: sin(x*pi/180) for x in range(0, 91)}
    >>> unique_words = set(word for line in page for word in line.split())
    >>> valedictorian = max((student.gpa, student.name) for student in graduates)
    >>> data = 'golf'>>> list(data[i] for i in range(len(data)-1, -1, -1))['f', 'l', 'o', 'g']

    版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
    网站建设 2026/2/14 14:13:34

    CLIP模型微调--附训练代码

    文章目录 CLIP模型微调方法 代码示例(PyTorch) 注意事项 CLIP模型微调方法 CLIP(Contrastive Language-Image Pretraining)是OpenAI提出的多模态模型,通过对比学习将图像和文本嵌入到同一空间。微调CLIP可适应特定任务,以下是关键步骤: 准备数据集 构建包含图像-文本对…

    作者头像 李华
    网站建设 2026/2/6 18:30:59

    程序员如何高效对接微信个人号API接口进行二次开发

    您是否正在为您的业务或项目寻求一个强大、高效、稳定的微信集成解决方案&#xff1f;您是否厌倦了直接与复杂的微信开放平台 API 打交道&#xff0c;花费大量时间在基础配置和签名校验上&#xff1f; 现在&#xff0c;是时候升级您的开发体验了&#xff01; 隆重推出 GeWe 框…

    作者头像 李华
    网站建设 2026/2/6 11:07:17

    C++面向对象与类和对象(一)----C++重要基础入门知识

    hello&#xff0c;这里是AuroraWanderll。 兴趣方向&#xff1a;C&#xff0c;算法&#xff0c;Linux系统&#xff0c;游戏客户端开发 欢迎关注&#xff0c;我将更新更多相关内容&#xff01;个人主页 这是类和对象系列的第一篇文章&#xff1a; 之前由于第一次发布时篇幅过长&…

    作者头像 李华
    网站建设 2026/2/12 7:16:06

    Flomo到Obsidian数据迁移终极指南:一键同步您的知识宝库

    Flomo到Obsidian数据迁移终极指南&#xff1a;一键同步您的知识宝库 【免费下载链接】flomo-to-obsidian Make Flomo Memos to Obsidian Notes 项目地址: https://gitcode.com/gh_mirrors/fl/flomo-to-obsidian 还在为Flomo和Obsidian之间的数据迁移而烦恼吗&#xff1f…

    作者头像 李华