Python迭代器和生成器

1|0前言

迭代器和生成器都是对可迭代的对象进行操作。

2|0迭代器

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。

  • 迭代器是一个可以记住遍历的位置的对象。

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  • 迭代器有两个基本的方法:iter() 和 next()。

2|1迭代器的优点:

  1. 可节省内存空间

  2. 会从容器里面挨个取值,直到取完为止

2|2迭代器的缺点

  1. 对迭代对象的取值不够灵活,只能从下一个开始

  2. 无法判断迭代器的长度

2|3示例

list = [1,2,3,4]
nums = iter(list)
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))

list = [1,2,3,4]
nums = iter(list)
for i in nums:
print(i)

list = [1,2,3,4]
nums = iter(list)
while True:
try:
print(next(nums))
except StopIteration:
break

3|0生成器

  • 在 Python 中,使用了 yield 的函数被称为生成器(generator)。

  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

  • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

  • 调用一个生成器函数,返回的是一个迭代器对象。

3|1生成器的优缺点

生成器本质上是迭代器,所以继承迭代器的所有优缺点。

3|2生成器对比普通循环

import sys
#查看占用内存大小
mylist = [i for i in range(10000000)]
print(type(mylist))
print('列表占用内存大小:',sys.getsizeof(mylist),'字节')
mygen = (i for i in range(10000000))
print(mygen)
print('生成器占用内存大小:',sys.getsizeof(mygen),'字节')


内存大小一目了然,内存数据相差万倍。所以采用生成器能有效优化数据占用量,尤其在读取大量的日志文件能有效避免内存溢出的错误。

3|3示例

第一种方法很简单,只要把一个列表生成式的[]改成(),就创建一个生成器(generator)。

ls = [x*x for x in range(10)]
print(type(ls))
print(ls)
ls2 = (x*x for x in range(10))
print(ls2)
for i in ls2:
print(i,end=',')


第二种方法,函数使用yield关键字,则它就是一个生成器。
yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。

def a(x):
for i in range(x):
yield i*i
s = a(5)
print(s)
for i in s:
print(i)

#生成器创建斐波那契数列
def fb(n):
a,b = 0,1
for i in range(n):
yield b
a,b = b,a+b
f = fb(10)
for i in f:
print(i,end=',')


__EOF__

本文作者Harry
本文链接https://www.cnblogs.com/harry66/p/13953132.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Harry_666  阅读(155)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示