生成器

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)
本文为原创文章,转载请标明出处
原文地址:https://www.cnblogs.com/harden13/p/6379411.html