Python之生成器

Python之生成器 

 生成器与return有何区别?
return只能返回一次函数就彻底结束了,而yield能返回多次值

  什么是生成器:

    生成器就是一个函数,但是,这个函数有个特殊的特性,就是有个yield关键字。

    生成器本身就是一个迭代器。

def test():
    print("..........")
    yield 1
g=test()
print(next(g)) #与return很像

     生成器执行next,才会执行函数,并在yield时,返回函数运行的一个结果。并返回yield的值。

 

  生成器干啥子用:

     生成器是将一个函数变成迭代器。

     而迭代器是将一个数据类型,变成迭代。

    yield一下,函数就拿一次的值,并将函数的运行停在yield的地方。在下一次yield的时,就接着上一次停的地方继续运行。

 yield到底干了什么事情:
#1.yield把函数变成生成器-->迭代器
#用return返回值能返回一次,而yield返回多次
#函数在暂停以及继续下一次运行时的状态是由yield保存

 

  什么情况下用生成器:

 

#取Linux的日志信息:将新增加的内容进行打印。

import time
def tail(file_path):
    with open(file_path,'r') as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if not line:
                time.sleep(0.3)
                continue
            else:
                # print(line,)
                yield line


#定义阶段
def grep(pattern,lines):
  for line in lines:
    if pattern in line:
      #print('\033[45m%s\003[0m' %line)
      yield line
#调用阶段,得到两个生成器对象
g1=tail('/tmp/a.txt')
g2=grep("error",g1)

#print(next(g2))
#next触发执行g2生成器函数
for line in g2:
  try:
    if "error" in line:
      print(line)
    else:
      print("==",line)

  except StopIteration:
    break
  

 

  生成器的优缺点:

    优点:

      1.迭代器提供了一种不依赖于索引的取值方法,这样就可以遍历那些没有索引的可迭代对象了(字典,集合)    

      2.迭代器与列表比较,迭代器是惰性计算,可以节省内存。

    缺点: 

       1.无法获取迭代器的长度,使用不如列表索引取值灵活。

       2.一次性的,只能往后取值,不能倒着取值。

 

 

  总结:

    yield的功能:

      1.相当于把__iter__  和 __next__ 方法封装到函数内部。

      2.与return相比,return只能返回一次,而yield能返回多次。

      3.函数暂停已经继续运行的状态是通过yield保存的。

  

    可以用生成器做管道,将左边的数据流传给右边。

 

yield生成器表达式:

    food = yield   就是一个生成器表达式。

 

 

  

 

 

 

  

posted @ 2018-05-15 11:40  王先生是胖子  阅读(201)  评论(0编辑  收藏  举报