前言
为了理解yield是什么,首先要明白生成器(generator
)是什么,在讲生成器之前先说说迭代器(iterator
),当创建一个列表(list
)时,你可以逐个的读取每一项,这就叫做迭代(iteration
)。
> mylist = [1, 2, 3] > for i in mylist : ... print(i) 1 2 3
mylist
是一个可迭代的对象。当使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:
> mylist = [x*x for x in range(3)] > for i in mylist : ... print(i) 0 1 4
可以使用“for··· in ···
”来操作可迭代对象,如:list
,string
,files
,这些迭代对象非常方便我们使用,因为你可以按照你的意愿进行重复的读取。但是你不得不预先存储所有的元素在内存中,那些对象里有很多元素时,并不是每一项都对你有用。
生成器同样是可迭代对象,但是你只能读取一次,因为它并没有把所有值存放内存中,它动态的生成值:
> mygenerator = (x*x for x in range(3)) > for i in mygenerator : ... print(i) 0 1 4
看起来除了把 [] 换成 () 外没什么不同。但是,你不可以再次使用 for i in mygenerator
, 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个…
yield
是一个类似 return
的关键字,只是这个函数返回的是个生成器。
> def createGenerator() : ... mylist = range(3) ... for i in mylist : ... yield i*i ... > mygenerator = createGenerator() # create a generator > print(mygenerator) # mygenerator is an object! <generator object createGenerator at 0xb7555c34> > for i in mygenerator: ... print(i) 0 1 4
这个示例本身没什么意义,但是它很清晰地说明函数将返回一组仅能读一次的值,要想掌握yield,首先必须理解的是:当你调用生成器函数的时候,如上例中的createGenerator()
,程序并不会执行函数体内的代码,它仅仅只是返回生成器对象,这种方式颇为微妙。函数体内的代码只有直到每次循环迭代(for)生成器的时候才会运行。
第一次迭代中你的函数会执行,从开始到达 yield
关键字,然后返回 yield
后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。
如果生成器内部没有定义 yield
关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能有所帮助,如果有疑问大家可以留言交流。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]