zoukankan      html  css  js  c++  java
  • 34-高级特性之generator(2)

    1. generator表达式:

    #generator表达式
    def test1():
        L = [ x*2 for x in range(5)] #list conprehension 
        G = ( x*2 for x in range(5))
        p(next(G))
        p(next(G))
        p(next(G))
        p(next(G))
        p(next(G)) #因为G的元素个数最大为5
        next(G) #报异常StopIteration
    #test1()
    
    def test2():
        G = ( x*2 for x in range(5))
        for g in G: #自动处理了StopIteration
            p(g)
    #test2()
    

    2. generator函数:yield

    def fib(times):
        n=0
        a,b=0,1
        while n<times:
            yield b  #yield(放弃)函数执行到这个地方会交出CPU控制权,停止执行,调用next再继续
            a,b=b,a+b
            n=n+1
        return "done"
     
    g = fib(5) #应该是5个元素,一次next(g)消耗一个。消耗完这个g就会销毁 {本次已经用了一个元素}
     
    print(next(g),'
    ')
     
    for x in g: #还能用4次
        print(x)
      
    #print(next(g),'
    ') #g的元素已经被for用完了
    

    3. send(), next(), __next__()

    • 都是用来激活generator的函数
    • send(实参) 可以给generator发送数据,实现外部控制内部
    • 对象名.send(None) 等价于 next(对象名), 对象名.__next__();所以send()是核心
    • 代码测试:

      def gen(times):
      n=0
      while n<times:
      temp = yield n*2
      print("temp = ", temp)
      n=n+1
      return "done"

      g = gen(5) #5次循环,5个元素
      g.send(None) # 等价于next(g),启动generator,以后默认都会
      g.send(666) #发送了666给temp
      print(' ')
      for x in g: #现在g里面还能生产3个元素
      print("x = ", x)

  • 相关阅读:
    docker 容器与主机之间的数据copy
    vim 中如何快速注释和取消注释
    java查找字符中的某个内容并替换
    linux正则表达式
    数据流重定向与管道命令
    linux杂七杂八
    linux变量
    redis常用命令操作
    redis基本操作介绍
    redis数据结构
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504557.html
Copyright © 2011-2022 走看看