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

相关推荐
无名的小三轮8 分钟前
第二章 信息安全概述
开发语言·php
与光同尘 大道至简12 分钟前
ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)
人工智能·python·单片机·机器人·github·人机交互·visual studio
清水白石00815 分钟前
深入 Python 对象模型:PyObject 与 PyVarObject 全解析
开发语言·python
独自破碎E19 分钟前
说说Java中的反射机制
java·开发语言
tjjucheng20 分钟前
小程序定制开发服务商推荐
python
囊中之锥.20 分钟前
《从零到实战:基于 PyTorch 的手写数字识别完整流程解析》
人工智能·pytorch·python
一直都在57227 分钟前
SpringBoot3 框架快速搭建与项目工程详解
java·开发语言
子云之风28 分钟前
LSPosed 项目编译问题解决方案
java·开发语言·python·学习·android studio
小北方城市网28 分钟前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
凯子坚持 c33 分钟前
C++大模型SDK开发实录(一):spdlog日志封装、通用数据结构定义与策略模式应用
数据结构·c++·sdk·策略模式