作业:迭代器与生成器(年会抽奖)

# 年会、答谢会、同学会总之各种会为了营造气氛,都会有一个你我他都喜欢的环节那就是抽奖,那么今天我们就来做一个抽奖游戏。要使用迭代器、生成器来完成。
# 作业背景
# 1.拟定一个奖品列表,奖品自定义(iPad iphoneX …)
# 2.每次抽奖后需要从列表中拿掉一个奖品(使用迭代器实现)
# 3.拟定一个抽奖概率不是每次都能抽到奖品(活用random函数+list配合)
# 4.中奖后需要给中奖人分配一个id 规则按照0001-000X(使用生成器实现)
# 注意事项:
# 1.中奖则生成一个中奖id ,不中奖当然就不需要了
# 2.中奖则从库中减少一个奖品(这里我们定义为一种奖品就一个,不做单奖品多数量)
# 3.注意如果奖品用尽(迭代器)则会报错,这里需要想办法屏蔽报错
# 输出要求:
# 抽一次奖,输出一次中奖状态,可以包含中奖和不中奖两个状态,如果中奖则需要输出奖品和中奖id


#使用一个生成器生成中奖ID
my_gen=(x for x in range(1,100))            #元组生成器

#参加抽奖总人数
total_p = 30

#奖品字典 包含奖品和奖品数量
prize_dict={'iPhone':2,'iPad':3,'macbook':1,'switch':3,'京东500元购物卡':5,'PS4':2}

import random

#用于抽奖的列表,称之为奖池,奖池开始为空,根据实际情况添加
lottery_list=[]

#抽奖概率的主控函数 可改变中奖概率大小
def probability(num_p,dic):
    '''
    :param num_p:公司参与抽奖的总人数
    :param dic: 奖品字典,包括奖品名称和奖品数量
    '''
    #这里做一级输入数据判断,让控制函数更加健壮一些。
    if type(num_p)!=int or type(dic)!=dict:
        print('输入的参数格式不准确')

    else:    #主控逻辑
        sum_dic=0
        #_____________先遍历奖品字典________________
        for k,v in prize_dict.items():
            #根据字典中各个奖品的数量,将奖品添加到抽奖池列表当中,改变奖品数量可以改变中奖概率
            for i in range(v):              #往奖池中添加同等数量的奖品
                lottery_list.append(k)
            sum_dic += v                    #这里要计算一下总奖品数量,下一步要用

        for j in range(num_p - sum_dic):
                #根据参与抽奖总人数往抽奖池中添加数据,将总人数减去奖品数
                #得到的数字就是往奖品池中添加不中奖的数量,改变人数可以改变中奖概率
                lottery_list.append('没中奖')
#help(probability)
#调用参数,传参
probability(total_p,prize_dict)

#打乱奖池中元素的顺序(添加是按照顺序添加,取也是按照顺序取,所以必须打乱)
#注意 shuffle是操作原始列表,不会创建新对象
#print(lottery_list)
random.shuffle(lottery_list)

#print(lottery_list)
#将已经打乱顺序的抽奖池列表转换成迭代器开始迭代抽奖
new_iter=iter(lottery_list)
#注意 取的时候从下标0开始取,不是从-1开始取

#抽奖习惯--一人一抽的模式
while True:
    if total_p!=0:
        print('开始抽奖请输入抽奖,结束抽奖请输入结束')
        if input()=='抽奖':
            p=next(new_iter)
            total_p-=1
            if p=='没中奖':
                print('很遗憾您没有中奖')
            else:                            #1  2  3   0001
                num=format(next(my_gen),'04d')#特别注意一下这里,需要通过format()函数转换一下四位digits
                print('恭喜您中奖了,奖品是:'+p+',中奖ID是:'+str(num))
        elif input()=='结束':
            break
    else:
        print('抽奖次数已用完')
        break

输出结果:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值