python中的yield方法原理详解

一、yield的作用是什么?
yield 的作用是将当前方法中的 yield之前的语句改为迭代器模式的代码,生成迭代器模式代码的大致规则如下:
(1). 将yield以前的语句定义在__next__方法中
(2). 将yield后面的数据作为__next__的返回值

二、yield的执行过程
(1). 调用当前方法,不执行(内部创建迭代器对象)
(2). 调用__next__方法,才执行
(3). 执行到yield语句,暂时离开
(4). 再次调用__next__方法,继续执行
(5). 重复第(3) / (4)步骤,直到最后

三、yield的具体使用
(1). yield的演示代码如下所示:

# encoding = utf-8
"""
@version:3.7
@author:qiuyucheng
@file:iterator_to_yield.py
@time:12:21
"""
class MyRange:  # 可迭代类
    def __init__(self, stop_value):
        self.__stop_value = stop_value

    def __iter__(self):
        # return MyRangeIterator(self.__stop_value)
        number = 0
        while number < self.__stop_value:
            # yield 作用:将下列代码改为迭代器模式的代码.
            # (1). 生成迭代器代码的大致规则:
            # 1. 将yield以前的语句定义在__next__方法中
            # 2. 将yield后面的数据number作为__next__的返回值
            # 3. 具体的变换看三引号注释部分
            # (2). 执行过程
            # 1. 调用当前方法,不执行(内部创建迭代器对象)
            # 2. 调用__next__方法,才执行
            # 3. 执行到yield语句,暂时离开
            # 4. 再次调用__next__方法,继续执行
            # 5. 重复第3/4步骤,直到最后
            yield number
            number += 1

"""
class MyRangeIterator:
    def __init__(self,end_value):
        self.__end_value = end_value
        self.__number = 0
    def __next__(self):
        temp =  self.__number
        if self.__number > self.__end_value - 1:
            raise StopIteration
        self.__number += 1
        return temp
"""

my_range = MyRange(10)
iterator = my_range.__iter__()
while True:
    try:
        item = iterator.__next__()
        print("打印数字:"item)
    except StopIteration:
        break

(2). 代码执行结果如下所示:

打印数字: 0
打印数字: 1
打印数字: 2
打印数字: 3
打印数字: 4
打印数字: 5
打印数字: 6
打印数字: 7
打印数字: 8
打印数字: 9

你可能感兴趣的:(python)