zoukankan      html  css  js  c++  java
  • 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('33[45m%s03[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   就是一个生成器表达式。

      

      

  • 相关阅读:
    Fast polling using C, memcached, nginx and libevent
    为什么MongoDB可以替代MySQL?
    comet server 的介绍及方案选型
    多任务服务器架构设计
    基于libev面向分布式数据系统的C10K服务器设计
    libev & libevent简介
    memcached、redis、mysql、mongodb结合架构数据库系统
    删除数组中的重复元素
    不用运算符比较两个int数的大小
    JDBC之简介
  • 原文地址:https://www.cnblogs.com/george92/p/9040173.html
Copyright © 2011-2022 走看看