• Python 3 中生成器函数yield表达式的使用


    生成器函数或生成器方法中包含了一个yield表达式。调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法)。每次调用__next__()时,生成器函数的yield表达式的值(如果未指定就是None)都会返回。如果生成器函数结束或执行一个return,就产生StopIteration异常。

    上面的说法有点官方,下边是一些个人的理解:

    1、当一个函数中包含有yield表达式时,在调用这个调用这个函数时,函数的代码并不会运行,而是返回一个迭代子,或者说是一个可用于迭代的容器(相当于一个数组的序列数)。如下面这个例子,当调用a()时并没有运行代码

    >>> def a():
    
                print('a')
    
                yield 'x'
    
    >>> a()
    
    <generator object a at 0x0000027BBFB380F8>
    
    >>>     
    

    2、要想使这个函数运行起来,就需要一个迭代器来读取这个容器内的内容,比如说for语句,如下:

    >>> for i in a():
                 i
    
    a
    'x'
    >>>     

    3、一个yield表达式只会产生“一个“迭代子,再解释一下,这个迭代子就同于序列[‘a’,’b’,’c’]中‘a’,’b’,’c’的位置参数0,1,2。如果有多个迭代子,当调用迭代器时,就会有多次迭代:

    def b():
    
        print('a')
    
        yield 1
    
        print('b')
    
        yield 3
    
    for i in b():
    
        print(i)
    
    a
    
    1
    
    b
    
    3
    
    >>> 
    

    例子中的for循环执行了两次,第一次迭代的是yield 1产生的迭代子(也可以简单的把它理解为序列的第一个序列号0),返回了结果1和yield 表达式前边的print(‘a’) 的结果,第二次迭代的是yield 3表达式产生的迭代子,结果为yield 3表达式的返回值3和它前边的语句print(‘b’)的结果。

    4、yield在一定程度上也有return的作用——都会返回一个值(即上面函数的‘x’)但yield不会终止函数,而是使函数暂停,直到所有的迭代子都被使用后,就会产生一个StopIteration异常,从而终止函数

    5、用iter函数来查看可迭代结构的具体过程。

    用a=iter(iterable结构)可以获取一个迭代子,在每次循环时可用next(a)方法获取下一个数据项,当结尾时会产生一个StopIteration异常。

    函数b()相当于一个包含了两个迭代子的容器;

    >>> c=iter(b())
    
    >>> next(c)
    
    a
    
    1
    
    >>> next(c)
    
    b
    
    3
    
    >>> next(c)
    
    Traceback (most recent call last):
    
    File "<pyshell#6>", line 1, in <module>
    
    next(c)
    
    StopIteration
    
    >>> 
    

    第一次和第二次迭代分别返回两个迭代子的结果,当所有的迭代子都已使用时,第三次迭代就产生了一个StopIteration。

    6、yield返回的就是迭代子的值,yield可以将任意内容设置为迭代子。大多数情况下我们理解的迭代子都是0,1,2,3,4...这样的自然位置迭代,而yield就把它设置为任意的值,a()函数生成的迭代子为 ‘x’,b()函数生成的迭代子为1,3。

  • 相关阅读:
    (八)shell 计算命令
    (七)shell内建命令
    (六)shell数组深入解析
    (五)shell字符串深入解析
    输出链表的倒数第K个值
    反转链表
    调整该数组中数字的顺序,奇数在前,偶数在后
    基类与派生类的对象调用
    printf以%d形式输出浮点数的问题
    数值的整数次方
  • 原文地址:https://www.cnblogs.com/aland-1415/p/6775415.html
Copyright © 2020-2023  润新知