理解python中yield关键字
2018-01-03 05:51
761 查看
本文转自stackoverflow中一个问题的译文
原文:http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
在这里,所有的值都存在内存当中,所以并不适合大量数据
只能读取一次
实时生成数据,不全存在内存中
注意你之后不能再使用
当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象
当你使用for进行迭代的时候,函数中的代码才会执行
第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。
原文:http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
可迭代对象
mylist是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:
>>> mylist = [x*x for x in range(3)] >>> for i in mylist : ... print(i) 0 1 4
在这里,所有的值都存在内存当中,所以并不适合大量数据
生成器
可迭代只能读取一次
实时生成数据,不全存在内存中
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator : ... print(i) 0 1 4
注意你之后不能再使用
for i in mygenerator了
yield关键字
yield是一个类似
return的关键字,只是这个函数返回的是个生成器
当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象
当你使用for进行迭代的时候,函数中的代码才会执行
>>> 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 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。
控制生成器的穷尽
>>> class Bank(): # let's create a bank, building ATMs ... crisis = False ... def create_atm(self) : ... while not self.crisis : ... yield "$100" >>> hsbc = Bank() # when everything's ok the ATM gives you as much as you want >>> corner_street_atm = hsbc.create_atm() >>> print(corner_street_atm.next()) $100 >>> print(corner_street_atm.next()) $100 >>> print([corner_street_atm.next() for cash in range(5)]) ['$100', '$100', '$100', '$100', '$100'] >>> hsbc.crisis = True # crisis is coming, no more money! >>> print(corner_street_atm.next()) <type 'exceptions.StopIteration'> >>> wall_street_atm = hsbc.create_atm() # it's even true for new ATMs >>> print(wall_street_atm.next()) <type 'exceptions.StopIteration'> >>> hsbc.crisis = False # trouble is, even post-crisis the ATM remains empty >>> print(corner_street_atm.next()) <type 'exceptions.StopIteration'> >>> brand_new_atm = hsbc.create_atm() # build a new one to get back in business >>> for cash in brand_new_atm : ... print cash $100 $100 $100 $100 $100 $100 $100 $100 $100 ...
相关文章推荐
- Python 中的黑暗角落(一):理解 yield 关键字
- 如何理解Python关键字yield
- python的迭代器iterator和生成器generator(关键字yield)的简单理解
- Python 中的黑暗角落(一):理解 yield 关键字
- python中yield关键字怎么理解?
- 通过“生产者-消费者模型”理解Python协程和yield关键字
- 理解 ES6 语法中 yield* 关键字的作用
- 彻底理解Python中的yield
- Python 深入理解yield
- Python天天美味(25) - 深入理解yield
- 正确理解python中的关键字“with”与上下文管理器
- python关键字之 yield
- Python yield的简单应用和理解
- 深入浅析Python中的yield关键字
- 深入理解python的yield和generator
- (转) Python Generators(生成器)——yield关键字
- 理解Python中的yield
- 【Python】理解yield和generator(生成器)
- 彻底理解Python中的yield
- Python Generators(生成器)——yield关键字