Python全栈之路8--迭代器(iter)和生成器(yield)
一、生成器( iter )
从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。
它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。
1、对比 range 和 xrange 的区别
1 2 3 4 | >>> print range ( 10 ) [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] >>> print xrange ( 10 ) xrange ( 10 ) |
如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。
def nrange(num): temp = -1 while True: temp = temp + 1 if temp >= num: return else: yield temp
#!/usr/bin/env python # _*_ coding:utf-8 _*_ def xrange(): print(11) yield 1 print(22) yield 2 print(33) yield 3 # 仅仅获取到了一个生成器 #含有yield的函数叫做生成器函数 r = xrange() #这是一个生成器 #生成器的__next__方法 ret = r.__next__() print(ret) ret = r.__next__() print(ret) ret = r.__next__() print(ret)
#!/usr/bin/env python # _*_ coding:utf-8 _*_ def n2(start,stop): start = start while stop: yield start start +=1 def xrange2(start,stop): obj = n2(start,stop) for i in range(start,stop): j = obj.__next__() print(j) def n1(stop): start = 0 while stop: yield start start +=1 def xrange1(stop): obj = n1(stop) for i in range(stop): j = obj.__next__() print(j) def xrange(*args): if len(args) == 1: xrange1(*args) elif len(args) == 2: xrange2(*args) else: print("参数不对 1 or 2") if __name__ == "__main__": xrange(2,11)
2、文件操作的 read 和 xreadlinex 的的区别
1 2 | read会读取所有内容到内存 xreadlines则只有在循环迭代时才获取 |
def NReadlines(): with open('log','r') as f: while True: line = f.next() if line: yield line else: return for i in NReadlines(): print i
def NReadlines(): with open('log','r') as f: seek = 0 while True: f.seek(seek) data = f.readline() if data: seek = f.tell() yield data else: return for item in NReadlines(): print item
二、迭代器 iterators
迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
迭代器可使用内建的iter方法创建,见例子:
1 2 3 4 5 6 7 8 9 10 11 | >>> i = iter ( 'abc' ) >>> i. next () 'a' >>> i. next () 'b' >>> i. next () 'c' >>> i. next () Traceback (most recent call last): File "<string>" , line 1 , in <string> StopIteration: |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!