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)