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)

  • 相关阅读:
    ActiveMQ
    bzoj 3039 悬线法求最大01子矩阵
    bzoj 1015 并查集
    bzoj 3037 贪心
    bzoj 2599 数分治 点剖分
    bzoj 2743 树状数组离线查询
    bzoj 2141 线段树套平衡树
    bzoj 3171 费用流
    bzoj 2751 快速幂
    bzoj 2956 数学展开,分段处理
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504557.html
Copyright © 2011-2022 走看看