python-三器 迭代器、生成器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。可迭代对象有迭代器、序列(字符串、列表、元祖)、字典,而迭代器是一个可以记住遍历的位置的对象。生成器是一种特殊的迭代器,调用一个生成器函数,返回的是一个迭代器对象。
迭代器 (Iterator)
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next(),他们都是python的内置函数,iter()会返回一个迭代器对象,迭代对象具有next()方法,在没有后续元素时next()会抛出一个StopIteration异常。
string、list、dict、tuple都可用于创建迭代器。
#生成器返回一个可迭代的生成器对象 b = (i for i in range(10)) def gen(): for i in range(10): yield i c = gen() print(b,c) print(next(b),next(c)) print(b.__iter__(),c.__iter__()) print(b.__next__(),c.__next__()) print(list(b),list(c)) #自定义迭代器 class Range(): def __init__(self, start, stop): self.start = start self.stop = stop def __iter__(self): return self def __next__(self): if self.start > self.stop: raise StopIteration temp = self.start self.start += 1 return temp ra = Range(1, 10) print(ra) #创建迭代器 print(next(ra)) #next()方法,可以记住位置 print(ra.__iter__()) #返回迭代器 print(ra.__next__()) #__next__()内置方法,可以记住位置
生成器(Generator )
生成器是创建迭代器的简单而强大的工具,使用了yield的函数被称为生成器,只是在需要返回数据的时候使用yield语句
生成器是一个返回迭代器的函数,同时也具备iter()和next()方法
生成器是一种特殊的迭代器,具迭代器特性,还具有有惰性,
生成器每次访问就给你返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始
#生成器返回一个可迭代的生成器对象 b = (i for i in range(10)) def gen(): for i in range(10): yield i c = gen() print(b,c) print(next(b),next(c)) print(b.__iter__(),c.__iter__()) print(b.__next__(),c.__next__()) print(list(b),list(c))
send()
send是生成器generator的一个方法,可以传入一个参数。
我们都知道yield表达式有一个值,而send就是控制这个表达式值的方法
如果send不携带参数,那么send(None)和next()的道理相同.
如果send的带有参数,那么send(value)中value就是yield表达式的返回值,但必须再此之前先用send(None)或next()启动生成器,再使用send(value)
启动生成器时,因为当前还没有yield表达式可以接收参数;启动之后,send(value)方法会将value值传给生成器的方法,value值会变成当前yield表达式的值,以及返回下一个yield返回值或者StopIteration异常。
def fuc(): while True: value = yield 'x' if value: print(f'value:{value}') e = fuc() print(e.send(None)) #启动 print(next(e)) #启动 print(e.send('y')) #将‘y’给value
迭代器、生成器区别
生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且
生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,
当生成生器终结时,还会自动抛出 StopIteration 异常。
""" 迭代器、生成器区别 1、共同点 生成器是一种特殊的迭代器,具有next()和iter()函数 2、不同点 a、语法上 迭代器可以通过iter()内置函数创建 生成器是通过函数的形式中调用yield 或 () 的形式创建的,且具有send()函数 b、用法上 迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程动作 生成器在调用next()函数或for循环中,所有值被返回,记录过程被执行的位置 生成器表达式、列表推导式的区别 1、列表推导式比较耗内存一次性加载,生成器表达式几乎不占内存,使用的时候才分配和使用内存 2、得到的值不一样:列表推导式得到的是一个列表,生成器表达式得到的是一个生成器 """ a = [i for i in range(10)] #返回列表,不具备next()方法 b = iter(range(10)) #返回了一个迭代器iterator c = (i for i in range(10)) #返回了一个可迭代的生成器generator print(f'a : {a}') print(f'b : {b}') print(f'c : {c}')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2020-04-13 Mysql查询字段与关键字重名