zoukankan      html  css  js  c++  java
  • python之生成器

    def repeater(value):
        while True:
            new = yield value
            print(first, new)
            if new is not None:
                value = new
                print('second', value)

    1.调用函数,并且使用next()方法

    >>>r = repeater(42)
    >>>type(r)
    <class 'generator'>
    >>>next(r)
    42

    理论知识
    生成器是一个包含yield关键字的函数。当被调用时,在函数中的代码不会被执行,而会返回一个迭代器。每次用next()方法请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句挂起该函数并向调用者发送回一个值,但是函数会保留足够的状态以使它被唤醒时就从停止的那点继续执行。而return语句意味着函数要停止执行。
    调用next方法时,迭代器会返回它的下一个值。

    代码分析
    第一行:函数调用,返回一个迭代器,但是不会执行repeater中的代码,参数value =42。
    第二行:用next()方法请求一个值。执行函数中的代码,直到遇到yield语句,也就是到第三行,yield语句生成值42。然后函数挂起(暂停执行,并等待重新唤起)。注意:此时new还未和yield返回值绑定。

    2.继续使用next()方法访问

    >>>next(r)
    ('first', None)
    42

    理论知识
    当生成器重新(不是第一次,即之前运行过yield语句)被运行的时候,yield方法返回一个值——若调用next()方法,返回None; 若调用send方法,yield表达式返回send方法发送的值。
    代码分析
    调用next()方法,函数被唤醒。yield语句返回None(注意:此时value的值并没有重新绑定,仍然为42),new和返回值None绑定。执行print语句。if语句判断为假,此次循环结束。while语句判断为真,遇到yield语句,返回value值42,函数挂起。

    3.使用send()方法

    >>>r.send('hello')
    ('first', 'hello')
    ('second', 'hello')
    'hello'

    代码分析
    调用send方法后,yield返回hello(注意:value值仍然为42),并和变量new绑定,即new=hello。执行print语句。if语句判断为真,value值重新绑定为hello,并且执行print语句。while语句为真,继续循环执行代码,直到调用了yield方法,而yield方法返回value值hello,函数挂起。

    4.再次使用next()方法

    >>>next(r)
    ('first', None)
    'hello'

    代码分析
    调用next方法后,yield返回None(value绑定值并没有改变,仍然为hello),并和new绑定。执行print语句。if语句判断为假.while判断为真,执行yield语句返回value的值hello,函数挂起。

  • 相关阅读:
    第二代:晶体管计算机
    第一代计算机
    Android应用在不同版本间兼容性处理
    eventBus
    realm
    ijkplayer详解AAA
    USB 3.0规范中译本 第3章 USB 3.0体系结构概览
    ES6 学习笔记
    07_通过上下文获取常见目录
    06_登陆案例保存信息完成
  • 原文地址:https://www.cnblogs.com/twtp/p/5559159.html
Copyright © 2011-2022 走看看