zoukankan      html  css  js  c++  java
  • Python复习之生成器 generator

    生成器 generator

    def h(): 
            print "hello" 
            m = yield 5 
            print "m:", m 
            d = yield 12 
            print "d:", d 
            print "world"
    

    结果

    c = h()
    c.next()  # hello   # 5
    c.next()  # m: None   # 12
    c.next()  # d: None   # world   # StopIteration
    

    yield类似于函数里面的return 返回yield后面的值 如:yield 5 会返回5
    那么 m = yield 5 这个m的值到底是多少? 现在从上面的结果看出来是 None。

    那么这个m值怎么来?

    send()方法和next()方法的功能有很大的重合:都是让函数体继续向下执行直到遇到下一个yield语句并挂起。而不同点是send(msg)方法会给生成器发送变量msg,并作为yield表达式的返回值赋值给其前面的变量,也就是h()中的m和d.
    next()就等价于send(None)。

    接着往下走

    c = h()
    c.send("I am m") 
    # TypeError: can't send non-None value to a just-started generator
    

    可以看到出错了,正如错误提示所说,对于刚开始的生成器是不能send 一个non-None值的。由此也可以知道,必须要先yield,才能send(msg)。再来:

    c = h()
    c.send(None) # hello   # 5
    c.send("I am m") # m: I am m   # 12
    c.send("I am d")  # d: I am d   # world   # StopIteration
    

    由上可以总结出,yield 后面的内容和前面的赋值其实没什么关系,前面的赋值是在yield 完成以后由send()决定的。
    next启动生成器,遇到yield则停止

  • 相关阅读:
    单调递增的数字
    合并K个升序链表
    ISO 8 自适应cell
    动态计算UITableViewCell高度
    APP上传
    多线程 GCD队列组
    多线程 线程之间的通信
    多线程 GCD
    多线程 线程同步问题
    多线程 线程的状态
  • 原文地址:https://www.cnblogs.com/wspblog/p/6188577.html
Copyright © 2011-2022 走看看