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

相关推荐
cch89181 小时前
汇编与Java:底层与高层的编程对决
java·开发语言·汇编
荒川之神2 小时前
拉链表概念与基本设计
java·开发语言·数据库
chushiyunen2 小时前
python中的@Property和@Setter
java·开发语言·python
禾小西2 小时前
Java中使用正则表达式核心解析
java·python·正则表达式
yoyo_zzm2 小时前
JAVA (Springboot) i18n国际化语言配置
java·spring boot·python
小樱花的樱花2 小时前
C++ new和delete用法详解
linux·开发语言·c++
froginwe112 小时前
C 运算符
开发语言
fengfuyao9853 小时前
低数据极限下模型预测控制的非线性动力学的稀疏识别 MATLAB实现
开发语言·matlab
摇滚侠3 小时前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js