标签:表达 关键字 pytho rom 应用 iter 计数器 异常 foo
生成器(generator)
生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器,调用这个函数得到一个生成器对象;
生成器函数
函数体中包含yield语句的函数,返回生成器对象,生成器对象是一个可迭代对象,是一个迭代器,生成器的函数体不会立即执行,next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出yield的值,并暂停函数执行;没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常;
def inc(): for i in range(5): yield i print(type(inc)) print(type(inc())) x = inc() print(type(x)) print(next(x)) for m in x: print(m,‘*‘) for m in x: print(m,‘**‘)
生成器函数可以使用next函数多次执行,每次返回一个值;
def gen(): print(‘line 1‘) yield 1 print(‘line 2‘) yield 2 print(‘line 3‘) return 3 next(gen()) next(gen()) g = gen() print(next(g)) print(next(g)) print(next(g)) print(next(g, ‘End‘))
生成器函数中,使用多个yield语句,执行一次后会暂停执行,把yield表达式的值返回;在次执行会执行到一个yield语句;return语句依然可以终止函数运行,但return语句的返回值不能获取到;return会导致无法继续获取下一个值,抛出StopIteration异常;如果函数没有显示return语句,如果生成器函数执行到结尾,一样会抛出StopIteration异常;
生成器的应用:
计数器
def inc(): def counter(): i = 0 while True: i += 1 yield i c = counter() return lambda : next(c) foo = inc() print(foo()) print(foo()) print(foo())
def inc(): def counter(): i = 0 while True: i += 1 yield i c = counter() def _inc(): return next(c) return _inc foo = inc() print(foo()) print(foo()) print(foo())
递归问题
pre = 0 cur = 1 print(pre,cur,end=‘ ‘) def fib1(n,pre=0,cur=1): pre,cur = cur,pre+cur print(cur,end=‘ ‘) if n == 2: return fib1(n-1,pre,cur) fib1(8)
yield from是python3.3出现的新语法
def counter(n): for x in range(n): yield x def inc(n): yield from counter(n) foo = inc(10) print(next(foo)) print(next(foo)) foo1 = counter(10) print(next(foo1)) print(next(foo1))
标签:表达 关键字 pytho rom 应用 iter 计数器 异常 foo
原文地址:http://www.cnblogs.com/52py/p/7692726.html