Python之yield简明详解

版权声明:编写不易,可看不可转,请知悉! https://blog.csdn.net/zha6476003/article/details/83043604

yield是Python中的生成器(只能在函数中使用)被称为generator function(发电机函数),他的作用是将函数中每次执行的结果以类似元组的形式保存起来一遍后续使用:

示例代码:

def sums():
    for j in range(5):
        for k in range(1):
            yield j, k # 循环一次yield得到两个数据
    return j, k


num = sums()
for a in num:  # 遍历返回的数据
    print(a)

执行结果:

(0, 0)
(1, 0)
(2, 0)
(3, 0)
(4, 0)

实例生成彩票号码:

"""
输入注数生成大乐透号码
红球取值范围1-36,篮球1-12
"""
import random


class GreatLotto:
    """
    需要一个生成次数count
    """
    global result  # 声明全局变量
    result = []

    def __init__(self, count):
        self.count = count

    def randoms(self):
        """
        :return: 返回传入次数的随机彩票号码(返回的是一个整体列表)
        """
        for i in range(self.count):
            for j in range(7):
                if j <= 4:
                    index1 = random.randrange(1, 36)
                    result.append(index1)
                if j > 4:
                    index1 = random.randrange(1, 13)
                    result.append(index1)
        return result  # 返回生成结果

    def start_end(self):
        """
        :return: 根据传入的次数判断列表取值的开始数和结束数
        """
        for k in range(self.count):
            if k < 1:  # 首次开始取值
                start1 = k
            else:
                start1 = k * 7
            end1 = start1 + 7  # 结束值
            yield end1, start1  # yield是生成器,将每次循环生成的结果储存(如果直接使用了return会结束循环,导致只能执行一次)


if __name__ == '__main__':
    try:
        num = int(input("请输入需要生成的注数:"))
    except ValueError:
        print('输入的格式错误!!!')
        num = int(input("请重新输入需要生成的注数:"))
    Great = GreatLotto(num)  # 实例化GreatLotto 并将输入的次数传入
    lists = Great.randoms()  # 得到返回的生成结果
    for end, start in Great.start_end():  # 遍历函数的生成器
        print(lists[start:end])  # 输出最终生成的结果

执行结果:
	请输入需要生成的注数:4
	[10, 5, 8, 26, 12, 10, 8]
	[6, 11, 14, 16, 16, 2, 6]
	[2, 1, 3, 17, 22, 8, 5]
	[19, 27, 28, 29, 9, 7, 7]

小知识
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

猜你喜欢

转载自blog.csdn.net/zha6476003/article/details/83043604