生成器
1.1生成器函数:带yield语句的函数成为生成器函数,生成器函数的返回值是生成器
def gen():
print('a')
yield 1
print('b')
yield 2
return 3
#执行生成器函数的时候,函数体并没有背执行
g = gen()
#执行到第一个yield的时候停止执行
next(g)
#从第一个yield之后开始执行,在第二个yield之前停止执行
next(g)
#从第二个yield开始执行,当没有更多yield的时候,抛出stopiteration异常,异常的值正好是返回值
生成器函数执行的时候不会执行函数体
当next一个生成器的时候,会执行到第一个yield语句,会弹出值,并且暂停函数
当再次next生成器的时候,从上次暂停处开始往下执行
当没有多余的yield的时候,会抛出stopiteration异常。异常的值是函数的返回值
def dedupe(item):
seen = set()
for items in item:
if items not in seen:
# print('this is a item {}'.format(items))
yield items
seen.add(items)
# print('this is a set {}'.format(seen))
lst =[1,5,2,1,9,1,5,10]
#generator本身就是一个iterator,所以肯定是iterable的 所有list后面可以放yield的返回值
print(list(dedupe(lst)))
#next 执行到第一个yield的时候停止执行,在次执行next的时候,从seen.add(items)上执行
# print(next(func))
for example :更好的理解list(generator)
def take (n):
for i in range(n):
yield i
l = list(take(4))
>>> l = [0,1,2,3]
yield from 是python3.3以后新出现的语法
def cocunter(n): for x in range(n): yield x def inc(n): yield from cocunter(n) foo = inc(10) for x in foo: print(x)
def cocunter(n): for x in range(n): yield x def inc(n): yield cocunter(n) foo = inc(10) print(foo) for x in foo: print(x) for j in x: print(j)
本文为原创文章,转载请标明出处

浙公网安备 33010602011771号