首页 > 编程 > Python > 正文

Python yield与实现方法代码分析

2020-02-22 23:08:13
字体:
来源:转载
供稿:网友

yield的功能类似于return,但是不同之处在于它返回的是生成器。

生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。

如果一个函数包含yield关键字,这个函数就会变为一个生成器。

生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。

由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。

基本操作

# 通过`yield`来创建生成器def func(): for i in xrange(10);  yield i
# 通过列表来创建生成器[i for i in xrange(10)]# 通过`yield`来创建生成器def func(): for i in xrange(10);  yield i# 通过列表来创建生成器[i for i in xrange(10)]Python# 调用如下>>> f = func()>>> f # 此时生成器还没有运行<generator object func at 0x7fe01a853820>>>> f.next() # 当i=0时,遇到yield关键字,直接返回>>> f.next() # 继续上一次执行的位置,进入下一层循环...>>> f.next()>>> f.next() # 当执行完最后一次循环后,结束yield语句,生成StopIteration异常Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration>>># 调用如下>>> f = func()>>> f # 此时生成器还没有运行<generator object func at 0x7fe01a853820>>>> f.next() # 当i=0时,遇到yield关键字,直接返回>>> f.next() # 继续上一次执行的位置,进入下一层循环...>>> f.next()>>> f.next() # 当执行完最后一次循环后,结束yield语句,生成StopIteration异常Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration>>>

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数。

>>> def func():...  n = 0...  while 1:...   n = yield n #可以通过send函数向n赋值... >>> f = func()>>> f.next() # 默认情况下n为0>>> f.send(1) #n赋值1>>> f.send(2)>>> >>> def func():...  n = 0...  while 1:...   n = yield n #可以通过send函数向n赋值... >>> f = func()>>> f.next() # 默认情况下n为0>>> f.send(1) #n赋值1>>> f.send(2)>>> 

应用

最经典的例子,生成无限序列。

常规的解决方法是,生成一个满足要求的很大的列表,这个列表需要保存在内存中,很明显内存限制了这个问题。

def get_primes(start): for element in magical_infinite_range(start):  if is_prime(element):   return elementdef get_primes(start): for element in magical_infinite_range(start):  if is_prime(element):   return element            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表