# 年会、答谢会、同学会总之各种会为了营造气氛,都会有一个你我他都喜欢的环节那就是抽奖,那么今天我们就来做一个抽奖游戏。要使用迭代器、生成器来完成。
# 作业背景
# 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
输出结果: