实例笔记之生成随机号码扩展知识 - yield(生成器)

随机生成验证码
示例代码:

import random     # 导入标准模块中的random

if __name__ == '__main__':
    check_code = ""                      # 保存验证码的变量
    for i in range(4):                  # 循环4次
        index = random.randrange(0, 4)    # 随机生成0~3中的一个数
        if index != i and index+1 != i:  # 从此开始就是随机生成一个字符或数字(不知道上面代码到底产生了几(因为随机),也不需要知道,反正结果能出4个字符验证码即可)
            check_code += chr(random.randint(97, 122))  # 随机生成a~z中的一个小写字母
        elif index+1 == i:
            check_code += chr(random.randint(65, 90))   # 随机生成A~Z中的一个大写字母
        else:
            check_code += str(random.randint(1, 9))     # 随机生成1~9中的一个数字
    print("验证码:", check_code)        # 输出生成的验证码


执行结果:
	验证码: xufz  # 随机不一定是这个

以上是生成4位随机验证码示例代码,需要位数更多改一下数字即可。

生成大乐透号码

原始代码:

"""
输入注数生成大乐透号码
红球取值范围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(self):
        """
        :return: 根据传入的次数判断列表取值的开始数
        """
        for l in range(self.count):
            if l < 1:
                two = l
            else:
                two = l * 7
            yield two  # yield是生成器,将每次循环生成的结果储存(如果使用了return会结束循环,导致只能执行一次)

    def ends(self, rer):
    """根据传入的次数判断列表取值的结束数"""
        for k in range((len(rer) + 1) // 7):  # 小数不能循环我们用地板除
            one = (k + 1) * 7
            yield one  # yield是生成器,将每次循环生成的结果储存(如果使用了return会结束循环,导致只能执行一次)


if __name__ == '__main__':
    num = int(input("请输入需要生成的注数:"))
    Great = GreatLotto(num)  # 实例化GreatLotto 并将输入的次数传入
    lists = Great.randoms()  # 得到返回的生成结果
    zips = zip(Great.start(), Great.ends(lists))  # 压缩两个函数 使for循环可以同时循环两个对象
    for m, n in zips:  # 遍历两个函数的生成器
        print(lists[m:n])

执行结果:
	请输入需要生成的注数:3
	[6, 15, 9, 34, 9, 8, 8]
	[17, 18, 6, 15, 6, 5, 2]
	[9, 29, 23, 22, 32, 1, 8]

改进版本:

"""
输入注数生成大乐透号码
红球取值范围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])  # 输出最终生成的结果

执行结果:
	请输入需要生成的注数:3
	[32, 27, 30, 2, 28, 10, 11]
	[25, 20, 15, 11, 34, 3, 3]
	[15, 11, 8, 15, 26, 7, 5]