【395】yield 生成器 和 yield from
yield:生成器
yield from:将生成器 yield 的内容相当于逐一在 yield 一般
参考:Python 3: Using "yield from" in Generators - Part 1 | Simeon Visser
迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
1 2 3 4 5 6 | >>> list = [ 1 , 2 , 3 , 4 ] >>> it = iter ( list ) # 创建迭代器对象 >>> print ( next (it)) # 输出迭代器的下一个元素 1 >>> print ( next (it)) 2 |
迭代器对象可以使用常规for语句进行遍历:
1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/python3 list = [ 1 , 2 , 3 , 4 ] it = iter ( list ) # 创建迭代器对象 for x in it: print (x, end = " " ) [output] 1 2 3 4 |
也可以使用 next() 函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/python3 import sys # 引入 sys 模块 list = [ 1 , 2 , 3 , 4 ] it = iter ( list ) # 创建迭代器对象 while True : try : print ( next (it)) except StopIteration: sys.exit() [out] 1 2 3 4 |
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
以下实例使用 yield 实现斐波那契数列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/python3 import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0 , 1 , 0 while True : if (counter > n): return yield a a, b = b, a + b counter + = 1 f = fibonacci( 10 ) # f 是一个迭代器,由生成器返回生成 while True : try : print ( next (f), end = " " ) except StopIteration: sys.exit() [output] 0 1 1 2 3 5 8 13 21 34 55 |
1. 生成器定义
在Python中,一边循环一边计算的机制,称为生成器:generator。
2. 为什么要有生成器
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
简单一句话:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2015-04-16 【164】ALL_VIDEOS
2012-04-16 【032】Mark Zuckerberg