python中的迭代器和生成器

1.迭代器

python的for循环就是通过迭代器来实现的,当我们使用for循环遍历一个容器时,python会自动创建一个迭代对象,并调用__next__()方法来获取容器中的下一个元素,直到容器中的所有元素都被遍历完毕。

除了使用for循环,还可以使用iter()函数来手动创建一个迭代器对象,并使用next()函数来获取容器中的下一个元素,这种方式可以让我们更灵活地控制迭代的过程。

当处理无法一次性加载到内存中的大文件、数据库记录或大规模数据结构时,迭代器可以逐条读取数据,无需全部加载,从而节省内存。

python 复制代码
# -*- coding: utf-8 -*-

data = [1, 3, 4, 5, 9]
it = iter(data)  # 迭代器,it 首先索引为 0

print(type(it))  # <class 'list_iterator'>
print(next(it))  # 1
print(next(it))  # 3
print(next(it))  # 4

# 查看迭代器中剩余的值
for item in it:
    print(item)  # 5 和 9
# 注意每次调用next就会减少减少迭代器中剩余的值

2.生成器

Python中一种特殊的迭代器,它是一个能按需生成值的轻量级对象。与一次性创建所有元素的数据结构(如列表或元组)不同,生成器在每次迭代时只生成下一个值,从而节省内存并支持无限序列或其他大量数据流的操作。可以用元组推导式或者yield关键字创建生成器。

用元组推导式创建生成器

python 复制代码
# -*- coding: utf-8 -*-

# data = [x for x in range(100000000)]
# 这种情况程序会运行很慢,占用内存很大

data = (x for x in range(100000000))
print(type(data))  # <class 'generator'> # 在循环时用来节约内存,
print(next(data))  # 0
print(next(data))  # 1
print(next(data))  # 2

使用 yield 的函数变成生成器(generator)

python 复制代码
def go1():
    print(100)
    print(200)
    print(300)


# 函数里面加 yield,变成生成器,分段执行
def go2():
    print(100)
    yield 1
    print(200)
    yield 2
    print(300)
    yield 5


# print(type(go1))   # <class 'function'>
# print(type(go1()))  # <class 'NoneType'>

# print(type(go2))  # <class 'function'>

gen = go2()
print(type(gen))  # <class 'generator'> # go2()是一个生成器

ret = next(gen)  # 执行语句"print(100)" 且返回值为 yield 后面设置的值 1
print(ret)  # 1

ret = next(gen)  # 执行语句"print(200)" 且返回值为 yield 后面设置的值 2
print(ret)  # 2

ret = next(gen)  # 执行语句"print(300)",且返回值为 yield 后面设置的值 5
print(ret)  # 5

# 注意,go2 函数不能直接调用,只能通过 next 来调用

# next(gen)  # 报错:StopIteration
try:
    next(gen)
except StopIteration:
    print("迭代结束")

访问生成器

python 复制代码
def go2():
    print(100)
    yield 1
    print(200)
    yield 2
    print(300)
    yield 5


gen = go2()
for item in gen:
    print(type(item))
    print(item)

"""
100
<class 'int'>
1
200
<class 'int'>
2
300
<class 'int'>
5

可以看到for循环遍历了生成器中的yield后面的那个值
"""

end

相关推荐
Python×CATIA工业智造11 分钟前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
onceco41 分钟前
领域LLM九讲——第5讲 为什么选择OpenManus而不是QwenAgent(附LLM免费api邀请码)
人工智能·python·深度学习·语言模型·自然语言处理·自动化
我叫小白菜1 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄1 小时前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python
weixin_446122462 小时前
JAVA内存区域划分
java·开发语言·redis
悦悦子a啊2 小时前
Python之--基本知识
开发语言·前端·python
QuantumStack3 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
whoarethenext3 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
笑稀了的野生俊4 小时前
在服务器中下载 HuggingFace 模型:终极指南
linux·服务器·python·bash·gpu算力
Naiva4 小时前
【小技巧】Python+PyCharm IDE 配置解释器出错,环境配置不完整或不兼容。(小智AI、MCP、聚合数据、实时新闻查询、NBA赛事查询)
ide·python·pycharm