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

相关推荐
zhougl9965 分钟前
Java 所有关键字及规范分类
java·开发语言
Python 老手10 分钟前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋26 分钟前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言
2501_9445255432 分钟前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
qq_417129251 小时前
C++中的桥接模式变体
开发语言·c++·算法
开源技术1 小时前
如何将本地LLM模型与Ollama和Python集成
开发语言·python
weixin_437044641 小时前
Netbox批量添加设备——堆叠设备
linux·网络·python
我有医保我先冲1 小时前
AI 时代 “任务完成“ 与 “专业能力“ 的区分:理论基础、行业影响与个人发展策略
人工智能·python·机器学习
Hello World . .1 小时前
数据结构:队列
c语言·开发语言·数据结构·vim
clever1011 小时前
在QtCreator 4.10.2中调试qt程序qDebug()输出中文为乱码问题的解决
开发语言·qt