生成器

生成器(generator)

  • 生成器含有yield关键字
    • 可以记录当前函数中执行的位置,下一次继续执行
    • next 和yield 是一对搭档
      • next 是开始函数的执行
      • yield 是停止函数的执行
  • 生成器函数调用不会执行这个函数,而是返回一个生成器
  • 所有的生成器都是迭代器

实例:监听文件的输入

def get_line():
    f = open('file',encoding='utf-8')
    while True:
        line = f.readline().strip()
        if line:
            yield line.strip()

line_g = get_line()
for line in line_g:
    print(line.split(','))
  • send(参数)
    • 相当于执行next,只不过传了一个值过去
  • yield from 
    • 相当于循环可迭代的每一项
    • 相当于for循环
    • 后面跟可迭代的对象

实例1:

def demo():
    for i in range(4):
        yield i

g=demo()    # g此时是一个生成器

g1=(i for i in g)   #g1是一个生成器表达式
g2=(i for i in g1)  #g2也是一个生成器表达式
print(list(g2))   #此时才开始对生成器取值,g2取值是在g1里面,g1又在g中取值,所以最后的结果是[0, 1, 2, 3]
print(list(g1)) #但是当此时g1在取值的时候,由于上面已经对g取过值了,所以结果是[]

执行结果:

[0, 1, 2, 3]
[]

 

实例2:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))
执行结果:[20, 21, 22, 23]

解析: 上面可以拆分如下

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
n=10
g = (add(n, i) for i in (add(n,i) for i in g))  #此时n为10
print(list(g))  

 

posted @ 2019-02-02 02:10  小萍瓶盖儿  阅读(118)  评论(0)    收藏  举报