您现在的位置是:亿华云 > IT科技
弄懂这 6 个问题,拿下 Python 生成器!
亿华云2025-10-09 06:56:13【IT科技】8人已围观
简介今天介绍生成器和yield的用法,通过如下8、9个小问题,相信大家会对它们有一点新的认识。1. 什么是可迭代对象?可迭代对象,英文Iterable,是一个形容词,这类对象和Java语言类似,都可看作是
今天介绍生成器和yield的弄懂用法,通过如下8、个问9个小问题,题拿相信大家会对它们有一点新的成器认识。
1. 什么是弄懂可迭代对象?
可迭代对象,英文Iterable,个问是题拿一个形容词,这类对象和Java语言类似,成器都可看作是弄懂一类接口,抽象地描述事物具备怎样的个问能力。所以,题拿Iterable自然具备可迭代能力。成器
如下,弄懂常见的个问list,Iterator等都是题拿Iterable对象:
In [33]: from collections.abc import Iterable,Iterator In [34]: issubclass(list,Iterable) Out[34]: True In [35]: issubclass(Iterator,Iterable)2. 什么是一个生成器?
生成器是可迭代的(Iterable),最简单的创建生成器方法是通过一对(),如下所示:
In [37]: g = (i*i for i in [1,4,0]) In [38]: g Out[38]: <generator object <genexpr> at 0x7fe8956e96d0>g 是一个生成器对象,generator object
获取生成器对象的元素,可使用next函数,云服务器如下所示,获取第一个元素:
In [39]: next(g) Out[39]: 1获取第二个元素:
In [40]: next(g) Out[40]: 163. 创建生成器的几种方法?
如上所见,使用一对()能够创建一个生成器对象。
除此之外,想必大家也都知道,是使用关键字 yield. yield出现在一个函数中,运行到yield处,返回的对象便是生成器对象(generator object).
4. 生成器是迭代器吗?
生成器对象(generator object)一定也是迭代器对象(Iterator object),如上面的生成器g,使用内置函数isinstance验证,返回True:
In [43]: isinstance(g,Iterator) Out[43]: True因此,它具备一切迭代器的特性,关于迭代器我们已在上一个话题讨论,简而言之,迭代器的几个特点:
是有去无回的, 迭代器无需提前知道整个列表的所有元素, 无需加载所有元素到RAM中尽而它是节省内存的(memory-efficient).生成器同样具备这些特性。除此之外,它还有一些独有的b2b供应网特性,下面跟随yield 我们便能看出来。
5. 如何用一句话描述 yield?
yield 关键字的用法在stackoverflow上也是最热的问题之一,借用一个最热回答中的解释:
yield is a keyword that is used like return, except the function will return a generator.yield 是一个特殊的return, 它返回一个生成器对象。
说实话,理解这些只是皮毛。那么,如何精通yield的用法呢?
6. 如何精通yield的用法?
要想精通yield,你必须首先搞清楚一点:
当你调用带有yield的函数时,函数并没有执行任何一行,只是返回一个生成器对象为了帮助大家理解,创建一个带有yield的函数:
def gfun(): mylist = range(3) for i in mylist: yield i*i g = gfun() print(g)为了加深印象,你可以自己调试验证一遍,函数第一行打的断点始终未被命中。
带yield的函数和for结合使用,第一次调用上一步创建的生成器对象后,将会进入函数体直到遇到yield返回值。
然后,免费信息发布网for循环再进入函数时,直接跑到yield的下一句。直到生成器对象变空为止。
使用下面代码演示yield的上面过程:
def createGenerator(): mylist = range(3) for i in mylist: yield i*i print(i*i) g = createGenerator() print(g) for gi in g: pass参考录制的gif:

7. yield 都有哪些重要价值?
Python引入yield后,便拥有具备实现协程的能力,协程的确是一种高效的编程模型,关于协程的理解,后面专题会详细讨论。包括更高级的功能如异步等,根基都是yield.
8. yield 和 itertools
yield重要性和使用广泛性还提现在,Python单独一个模块专门用于管理迭代器和生成器对象,便是itertools,里面封装的方法特性后面再讨论。
9. yield 使用案例
yield实现浮点数步长的frange:
def frange(start,end,step): i = start while i<end: yield round(i,3) i+=step调用frange:
for item in frange(10,14,0.8): print(item)结果:
10 10.8 11.6 12.4 13.2很赞哦!(84)
上一篇: 小白注册网站域名该怎么办?有什么步骤?
相关文章
- 2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
- 如何利用边缘数据中心重塑计算的未来
- 数据中心自动化如何简化操作并减少错误
- 如何处理过时的数据中心硬件?
- CNAME:对应解析的记录值为域名地址
- AMD 正式发布Kria K24 SOM及入门套件,赋能工业与商业应用等边缘创新
- 5 种最有发展前景的 AI 硬件技术
- 四次刮骨疗毒,苹果是无可争议的卷王!
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 2023年影响数据中心安全的五大风险