Python之yield简明详解

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

什么是生成器?

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

示例代码:

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错误表示无法继续返回下一个值了。

转载于:https://www.cnblogs.com/weibgg/p/10786980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值