zoukankan      html  css  js  c++  java
  • python之yield表达式

    yield表达式用于generator function

    调用generator function时,返回一个iterator(函数内语句不被会执行),调用iterator函数时,执行到yield表达式,

    当前函数暂停执行,返回表达式的值到调用者,继续调用iterator函数,从暂停处恢复执行。、

    遇到yield表达式,与遇到其他表达式差不多,yield表达式也有值,一般为None。

    与其他表达式的不同之处在于yield表达式会在yield处返回表达式的值

    官方文档描述如下:

        When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of the generator function. The execution starts when one of the generator’s methods is called. At that time, the execution proceeds to the first yield expression, where it is suspended again, returning the value of expression_list to the generator’s caller. By suspended, we mean that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. When the execution is resumed by calling one of the generator’s methods, the function can proceed exactly as if the yield expression were just another external call. The value of the yield expression after resuming depends on the method which resumed the execution. If __next__() is used (typically via either a for or the next() builtin) then the result is None. Otherwise, if send() is used, then the result will be the value passed in to that method.

        Yield expressions are allowed anywhere in a try construct. If the generator is not resumed before it is finalized (by reaching a zero reference count or by being garbage collected), the generator-iterator’s close() method will be called, allowing any pending finally clauses to execute.

        When the underlying iterator is complete, the value attribute of the raised StopIteration instance becomes the value of the yield expression. 

    官方例子:

    >>> def echo(value=None):
    ...     print("Execution starts when 'next()' is called for the first time.")
    ...     try:
    ...         while True:
    ...             try:
    ...                 value = (yield value)
    ...             except Exception as e:
    ...                 value = e
    ...     finally:
    ...         print("Don't forget to clean up when 'close()' is called.")
    ...
    >>> generator = echo(1)
    >>> print(next(generator))
    Execution starts when 'next()' is called for the first time.
    1
    >>> print(next(generator))
    None
    >>> print(generator.send(2))
    2
    >>> generator.throw(TypeError, "spam")
    TypeError('spam',)
    >>> generator.close()
    Don't forget to clean up when 'close()' is called.

    模拟个iteratorrange函数

    def my_range(start, stop=None, step=1):
        if not stop:
            stop = start
            start = 0
        while start < stop:
            yield start
            start += step
    
    
    if __name__ == '__main__':
        for i in my_range(10):
            print(i)
        for i in my_range(0, 10):
            print(i)
        for i in my_range(0, 10, 2):
            print(i)
  • 相关阅读:
    Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)
    zookeeper 集群配置
    centos yum 安装 mariadb
    Oracle jdbc 插入 clob blob
    oracle 删除用户,提示“无法删除当前已连接的用户”
    oracle 创建表空间,用户并授权
    Linux 根分区扩容
    同时运行多个 tomcat 修改端口
    mysql新建用户及授权
    php sql 类似 mybatis 传参
  • 原文地址:https://www.cnblogs.com/xkxjy/p/9747754.html
Copyright © 2011-2022 走看看