| 万叶集 |
|---|
| 隐约雷鸣,阴霾天空。 |
| 但盼风雨来,能留你在此。 |
文章目录前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 哈士奇 。(我真的有一只哈士奇)
CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
系列专栏:
⛽️ Python全栈系列 - [更新中] 【 本文在该系列】
Python零基础入门篇
Python语法进阶篇
网安之路系列
网安之路踩坑篇
网安知识扫盲篇
Vulhub 漏洞复现篇
Shell脚本编程篇
Web攻防篇 2021年9月3日停止更新,转战先知等安全社区
渗透工具使用集锦 2021年9月3日停止更新,转战先知等安全社区
⭐️ 点点点工程师系列
测试神器 - Charles 篇
测试神器 - Fiddler 篇
测试神器 - Jmeter 篇
自动化 - RobotFrameWork 系列
自动化 - 基于 JAVA 实现的WEB端UI自动化
自动化 - 基于 MonkeyRunner 实现的APP端UI自动化
- 构造函数内添加 1 - 100 的列表用于判断中奖率
- 抽奖函数 - choice_gift()
大家好呀,这一章节我们来开发 “gift” 这个项目中最重要的核心部分,抽奖函数的相关逻辑。大概分三层来进行开发:
构造函数内添加 1 - 100 的列表用于判断中奖率
- 第一层:首先要去做随机判断奖池第一层的奖品等级,也就是 PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize'] ;利用 random 模块的随机数分别获取 'FourthPrize'、 'ThirdPrize'、 'SecondPrize'、 'FirstPrize'。
- FourthPrize:1-50,即 50%概率
- ThirdPrize:51-80,即 30%概率
- SecondPrize:81-95,即 15% 概率
- FirstPrize:96-100,即 5% 概率
- 第二层:当获取到了 第一层 的奖品等级(也就是 [‘FourthPrize’, ‘ThirdPrize’, ‘SecondPrize’, ‘FirstPrize’])之后,紧接着就是获取第二层级的奖品信息。第二层依然需要判断,也就是 LEVELNUMS = ['level1', 'level2', 'level3'] ;然后利用 random 模块的随机数分别获取 ['level1', 'level2', 'level3'] 。
- level1:1-80,即 80% 概率
- level2:81-95,即 15% 概率
- level3:96-100,即 5% 概率
- 第三层:拿到最终的奖池信息之后,接下来就需要获取到最终的奖品信息(即获取到对应层级的真实奖品)。这个时候可以随机一个奖品并查看奖品的数量是否为 0 ,不为 0 则中奖并提示用户,同时奖品数量减 1 ,将奖品信息更新到 user.json 文件的 gifts 标签内;若数量为 0 ,则提示用户未中奖。
PS:在构造函数内定义一个 1 - 100 的列表 ,用于判断用户的中奖概率。
代码示例如下:
class User(Base): # 定义 user 类,继承 Base 类
def __init__(self, username, user_json, gift_json): # 构造函数
self.username = username
self.gift_random = list(range(1, 101)) # 添加 1 - 100 的列表用于判断中奖率
super().__init__(user_json, gift_json) # 同时也利用super()函数继承并使用 Base 类的构造函数
self.get_user()
抽奖函数 - choice_gift()
代码示例如下:choice_gift() 函数
# coding:utf-8
import os
import random
from base import Base
from common.utils import timestamp_to_string
from common.error import NotUserError, UserActiveError, RoleError, CountError
"""
*****************************************************************************************************
1、user 类的初始化( `继承Base类`)
2、get_user(`Base类中时间的转变`)
3、查看奖品列表(`针对 Base 类 的获取奖品函数进行二次开发`)
*****************************************************************************************************
抽奖逻辑的实现:
第一层:首先要去做随机判断奖池第一层的奖品等级,
也就是 `PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']` ;
利用 `random` 模块的随机数分别获取 `'FourthPrize'、 'ThirdPrize'、 'SecondPrize'、 'FirstPrize'`。
- FourthPrize:1-50,即 50%概率
- ThirdPrize:51-80,即 30%概率
- SecondPrize:81-95,即 15% 概率
- FirstPrize:96-100,即 5% 概率
第二层:当获取到了 第一层 的奖品等级(也就是 ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize'])之后,
紧接着就是获取第二层级的奖品信息。第二层依然需要判断,也就是 `LEVELNUMS = ['level1', 'level2', 'level3']` ;
然后利用 `random` 模块的随机数分别获取 `['level1', 'level2', 'level3']` 。
- level1:1-80,即 80% 概率
- level2:81-95,即 15% 概率
- level3:96-100,即 5% 概率
第三层:拿到最终的奖池信息之后,接下来就需要获取到最终的奖品信息(即获取到对应层级的真实奖品)。
这个时候可以随机一个奖品并查看奖品的数量是否为 0 ,不为 0 则中奖并提示用户,同时奖品数量减 1 ,
将奖品信息更新到 `user.json` 文件的 `gifts` 标签内;若数量为 0 ,则提示用户未中奖。
*****************************************************************************************************
"""
class User(Base): # 定义 user 类,继承 Base 类
def __init__(self, username, user_json, gift_json): # 构造函数
self.username = username
self.gift_random = list(range(1, 101)) # 添加 1 - 100 的列表用于判断中奖率
super().__init__(user_json, gift_json) # 同时也利用super()函数继承并使用 Base 类的构造函数
self.get_user()
def get_user(self): # 定义 get_user() 函数
users = self._Base__read_users() # 实例化 Base 类的 __read_user()方法
if self.username not in users: # 判断 username 是否存在,不存在则抛出自定义的 NotUserError 异常
raise NotUserError('not user %s' % self.username)
current_user = users.get(self.username) # 获取用户名
if current_user.get('active') == False: # 判断用户是否处于可用状态
raise UserActiveError('the user %s had not use'.format(self.username))
if current_user.get('role') != 'normal': # 判断用户的权限是否是 normal ,非 normal 不可参与抽奖
raise RoleError('permission by normal')
self.user = current_user
self.name = current_user.get('username')
self.role = current_user.get('role')
self.gifts = current_user.get('gifts')
self.create_time = timestamp_to_string(current_user.get('create_time'))
def get_gifts(self): # 定义 get_gifts 函数,获取奖品信息
gifts = self._Base__read_gifts() # 调用 Base 类的 __read_gifts() 函数
# print(gifts) # 调试打印输出 Base 类的 __read_gifts() 函数 获取的奖品信息
gift_lists = [] # 定义 一个空列表,用以存储 "奖品信息"
for prize_level, prize_level_pool in gifts.items(): # for 循环获取第一层级下的奖品信息;其实我们需要的就是奖品信息
# print(prize_level_pool) # 调试打印输出 第一层级下的奖品信息
for level_num, level_num_pool in prize_level_pool.items():
# print(level_num_pool) # 调试打印输出 第二层级下的奖品信息
for gift_name, gift_info in level_num_pool.items():
# print(gift_info) # 调试打印输出 第二层级下的奖品的详细信息
gift_lists.append(gift_info.get('name')) # 将 gift_info 获取到的奖品的 name 添加至 gift_lists 列表
# print(gift_lists) # 调试打印输出 gift_lists 列表的奖品信息
return gift_lists # 返回 gift_lists 列表
def choice_gift(self):
# TODO 获取第一层级的信息
first_level, second_level = None, None
prize_level_count = random.choice(self.gift_random) # 获取第一层级的随机数字
if 1 <= prize_level_count <= 50: # 判断获取的随机数字,根据数字获取对应的第一层级的奖品等级;否则抛出自定义 CountError 异常
first_level = 'FourthPrize'
elif 51 <= prize_level_count <= 80:
first_level = 'ThirdPrize'
elif 81 <= prize_level_count <= 95:
first_level = 'SecondPrize'
elif 96 <= prize_level_count <= 100:
first_level = 'FirstPrize'
else:
raise CountError('prize_level_count need 0~100')
gifts = self._Base__read_gifts()
prize_level = gifts.get(first_level)
# print(prize_level) # 调试打印输出每次获取的第一层级 prize_level 对应的奖品信息(每次都不一样)
level_num_count = random.choice(self.gift_random) # 获取第二层级的随机数字
if 1 <= level_num_count <= 80: # 判断获取的随机数字,根据数字获取对应的第二层级的奖品等级;否则抛出自定义 CountError 异常
second_level = 'level1'
elif 81 <= level_num_count <= 95:
second_level = 'level2'
elif 96 <= level_num_count <= 100:
second_level = 'level3'
else:
raise CountError('level_num_count need 0~100')
level_num = prize_level.get(second_level)
# print(level_num) # 调试打印输出每次获取的第二层级 level_num 对应的奖品信息(每次都不一样)
if len(level_num) == 0: # 判断奖品信息长度,如果为 0 则提示未中奖
print('哦可惜 您没有中奖')
return
gift_names = [] # 定义一个空列表用以存储奖品名称
for name, _ in level_num.items(): # 这里的 "_" 是为了屏蔽 level_num 这个第二层级奖品信息(字典形式)的 value 的值
gift_names.append(name)
gift_name = random.choice(gift_names)
# print(gift_name) # 调试打印输出 gift_name
gift_info = level_num.get(gift_name)
if gift_info.get('count') <= 0:
print('哦可惜 您没有中奖')
return
gift_info['count'] -= 1
level_num[gift_name] = gift_info
# print(level_num[gift_name]) # 调试打印输出 level_num[gift_name] 的信息
prize_level[second_level] = level_num
gifts[first_level] = prize_level
self._Base__save(gifts, self.gift_json)
self.user['gifts'].append(gift_name)
self.update()
print('恭喜 {} 获得 {} 奖品'.format(self.name, gift_name))
def update(self): # 定义一个 update 函数,用以抽奖函数 choice_gift();【用户抽完奖后,更新该用户的 gifts 标签】
users = self._Base__read_users()
users[self.username] = self.user
self._Base__save(users, self.user_json)
if __name__ == '__main__':
gift_path = os.path.join(os.getcwd(), 'storage', 'gift.json')
user_path = os.path.join(os.getcwd(), 'storage', 'user.json')
user = User('Adem', user_path, gift_path)
# print('username:', user.username, 'create_time:', user.create_time, 'gifts:', user.gifts, 'role:', user.role)
# result = user.get_gifts()
# print(result)
result = user.choice_gift()
print(result)
执行结果如下:



