自学Python第六天:实战练习——机选双色球
Python自学第六天:实战练习——机选双色球
我是一个编程小白,目前从事运维工作。
对于运维相关的技术,基本上都是了解点皮毛。
因为最近接触自动化运维工具,看到很多工具都需要用到Python来写脚本。
于是,利用业余时间,开始自学Python。
目的并不是要学到很精通,而是希望大致看明白别人写的代码,自己也可以编写一些简单的代码即可。
下面是我结合最近几天的学习成果,又通过网络简单查询学习了一下:random.sample 的功能和使用方法,编写的一段代码。
大致功能就是,可以根据用户的选择,随机生成双色球彩票号码,并计算出购买这些彩票所需要的金额。
不多不少,正好200行。
一方面,相对于这六天的学习时间来说,
这次实战练习的效果,我还是比较满意的,也坚定了我继续学习下去的信心。
另一方面,在写代码的过程中,自己可以感觉出来,这段代码非常的臃肿,这应该是受我目前所掌握的知识太少所限。
希望日后可以有所改善,
也希望如果哪位前辈高人,机缘巧合看到了我的这篇博文,可以不吝赐教一下后学末进,在此不胜感激!!!
OK,废话不多少,直接上代码。
#!/var/bin/env python
# -*- coding:utf-8 -*-
# 双色球机选小程序,可以根据用户的选择,输入对应的彩票号码和金额
# 作者:王龙
# 最后日期:2022年9月7日
# version: v0.1
import random
red_ball = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33} # 定义红色球列表;
blue_ball = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} # 定义蓝色球列表;
menu1 = menu2 = menu3 = red_count = blue_count = price = "0" # 为了消除“变量未定义”报错。
info1 = """
##################################
欢迎使用双色球机选工具 v1.0
##################################
---------- 投注模式 ----------
1 单式
2 复式
""" # 定义1级菜单;
info2 = """
--------- 随机&锁定号码 ---------
1 全部随机
2 手动锁定个别号码
""" # 定义2级菜单;
info3 = """
---------- 锁定号码 ----------
1 仅锁定红球
2 仅锁定蓝球
3 红球、蓝球均锁定
""" # 定义3级菜单;
level = 1 # 为了进入while定义
while level == 1: # 当 level = 1 时 while 循环开始;
print(info1) # 打印1级菜单;
menu1 = input("您选择的投注模式为:") # 提示用户输入;
if not (menu1 == "1" or menu1 == "2"): # 判断,如果用户输入的menu1不是“1”或“2”;
print("输入有误,请重新输入。") # 提示用户;
continue # 结束本次循环,返回while重新开始;
if menu1 == "1": # 如果,menu1 = “1”;
level = 2 # 赋值level = 2;
if menu1 == "2": # 如果,menu1 = "2";
level = 4 # 赋值level = 4;
while level == 4: # 当 level = 4 时 while 循环开始;
red_count = input("请输入红球数量[6-20]:") # 提示用户输入复式红球数量;
blue_count = input("请输入蓝球数量[1-16]:") # 提示用户输入复式蓝球数量;
r = 6 <= int(red_count) <= 20 # r 如果大于等于6,小于等于20 则为 True,否则为 False;
b = 1 <= int(blue_count) <= 16 # b 如果大于等于1,小于等于16 则为 True,否则为 False;
if r and b: # 如果 a 和 b 均为 True;
level = 2 # 赋值 level = 2;
else: # 否则
print("输入有误,请重新输入。") # 提示用户;
continue # 结束本次循环,返回while重新开始;
while level == 2: # 当 level = 2 时,while 循环开始;
print(info2) # 打印2级菜单
menu2 = input("请输入您的选项:") # 提示用户输入;
if not (menu2 == "1" or menu2 == "2"): # 如果 menu2 不是 “1” 或 “2”;
print("输入有误,请重新输入。") # 提示用户输入错误
continue # 结束本次循环,返回while重新开始;
if menu2 == "1": # 如果 menu2 = “1”;
level = 0 # 赋值 level = 0;
if menu2 == "2": # 如果 menu2 = “2”;
level = 3 # 赋值 level = 3;
while level == 3: # 当 level = 3 时,while 循环开始;
print(info3) # 打印3级菜单;
menu3 = input("请输入您的选项:") # 提示用户输入
if not (menu3 == "1" or menu3 == "2" or menu3 == "3"): # 如果 menu3 不是 “1” 或 “2” 或 “3”;
print("输入有误,请重新输入。") # 提示用户输入错误;
continue # 结束本次循环,返回while重新开始;
else: # 否则;
break # 结束循环;
cycle = int(input("您需要机选几组号码:")) # 提示用户如数机选几组号码,int转换为整型,方便后面使用;
if menu1 == "1": # 如果 menu1 = “1”;
if menu2 == "1": # 如果 menu2 = “1”;
for i in range(cycle): # 循环 cycle 次;
red_sample = random.sample(red_ball, 6) # 从集合 red_ball 中,随机抽取 6 个元素,组成列表 red_sample;
red_sample.sort(reverse=False) # 将列表列表 red_sample 从小到大排序;
blue = random.sample(blue_ball, 1) # 从集合 blue_ball 中,随机抽取 1 个元素,组成列表 blue;
number = i + 1 # 赋值 number = i + 1 # (i从0 开始到 cycle-1 结束,);
text = "第{0}组,红球:{1} + 蓝球:{2}" # 赋值字符串 text 格式化;
msg = text.format(number, red_sample, blue) # 字符串 text 格式化,{0} = number | {1} = red_sample | {2} = blue;
print(msg) # 打印字符串 msg;
if menu3 == "1": # 如果 menu3 = “1”;
red_lock = input("请输入您要锁定的红球号码,多个号码间,请使用”+“加号间隔:") # 提示用户输入锁定的红球,赋值给字符串 red_lock;
red_lock_list = red_lock.split("+") # 以 “+” 为分隔符,分割字符串 red_lock,生成列表 red_lock_list;
red_lock_set = set() # 创建一个空集合,red_lock_set;
for num in red_lock_list: # 对列表 red_lock_list 进行 for 循环;
red_lock_set.add(int(num)) # num转换为整型,追加到集合 red_lock_set 中;
red_dif = red_ball.difference(red_lock_set) # 获取 red_ball 对 red_lock_set 的差集,生成新集合 red_dif;
for i in range(cycle): # 循环 cycle 次;
red_dif_sample = random.sample(red_dif, 6 - len(red_lock_set)) # 从集合 red_dif 中,抽取6-len(red_lock_set)组成新列表;
red_sample = list(set(red_dif_sample).union(red_lock_set)) # 取 red_dif_sample 和 red_lock_set 的并集组成新列表;
red_sample.sort(reverse=False) # 将列表 red_sample 从小到大排序;
blue = random.sample(blue_ball, 1) # 从集合 blue_ball 中,随机抽取 1 个元素,组成列表 blue;
number = i + 1 # 赋值 number = i + 1 # (i从0 开始到 cycle-1 结束,);
text = "第{0}组,红球:{1} + 蓝球:{2}" # 赋值字符串 text 格式化;
msg = text.format(number, red_sample, blue) # 字符串 text 格式化,{0} = number | {1} = red_sample | {2} = blue;
print(msg) # 打印字符串 msg;
if menu3 == "2": # 如果 menu3 = "2";
blue_lock = input("请输入您要锁定的蓝球号码:") # 提示用户输入锁定的蓝球,赋值给字符串 red_lock;
blue = "[%s]" % (blue_lock,) # 字符串 blue_lock 格式化后,赋值给 字符串 blue;
for i in range(cycle): # 循环 cycle 次;
red_sample = random.sample(red_ball, 6) # 从集合 red_ball 中,随机抽取 6 个元素,组成列表 red_sample;
red_sample.sort(reverse=False) # 将列表 red_sample 从小到大排序;
number = i + 1 # 赋值 number = i + 1 # (i从0 开始到 cycle-1 结束,);
text = "第{0}组,红球:{1} + 蓝球:{2}" # 赋值字符串 text 格式化;
msg = text.format(number, red_sample, blue) # 字符串 text 格式化,{0} = number | {1} = red_sample | {2} = blue;
print(msg) # 打印字符串 msg;
if menu3 == "3": # 如果 menu3 = "3";
blue_lock = input("请输入您要锁定的蓝球号码:") # 提示用户输入锁定的蓝球,赋值给字符串 red_lock;
blue = "[%s]" % (blue_lock,) # 字符串 blue_lock 格式化后,赋值给 字符串 blue;
red_lock = input("请输入您要锁定的红球号码,多个号码间,请使用”+“加号间隔:") # 提示用户输入锁定的红球,赋值给字符串 red_lock;
red_lock_list = red_lock.split("+") # 以 “+” 为分隔符,分割字符串 red_lock,生成列表 red_lock_list;
red_lock_set = set() # 创建一个空集合,red_lock_set;
for num in red_lock_list: # 对列表 red_lock_list 进行 for 循环;
red_lock_set.add(int(num)) # num转换为整型,追加到集合 red_lock_set 中;
red_dif = red_ball.difference(red_lock_set) # 获取 red_ball 对 red_lock_set 的差集,生成新集合 red_dif;
for i in range(cycle): # 循环 cycle 次;
red_dif_sample = random.sample(red_dif, 6 - len(red_lock_set)) # 从集合 red_dif 中,抽取6-len(red_lock_set)组成新列表;
red_sample = list(set(red_dif_sample).union(red_lock_set)) # 取 red_dif_sample 和 red_lock_set 的并集组成新列表;
red_sample.sort(reverse=False) # 将列表 red_sample 从小到大排序;
number = i + 1 # 赋值 number = i + 1 # (i从0 开始到 cycle-1 结束,);
text = "第{0}组,红球:{1} + 蓝球:{2}" # 赋值字符串 text 格式化;
msg = text.format(number, red_sample, blue) # 字符串 text 格式化,{0} = number | {1} = red_sample | {2} = blue;
print(msg) # 打印字符串 msg;
price = int(cycle) * 2 # 单式机选价格公式,每注2元,共 cycle 注;
if menu1 == "2": # 用户选择复式,很多与之前时一样。
if menu2 == "1":
for i in range(cycle):
red_sample = random.sample(red_ball, int(red_count)) # 从 red_ball 中,随机抽取 red_count 个元素(用户选择的复式红球数)
red_sample.sort(reverse=False)
blue = random.sample(blue_ball, int(blue_count)) # 从 blue_ball 中,随机抽取 blue_count 个元素(用户选择的复式蓝球数)
blue.sort(reverse=False)
number = i + 1
text = "第{0}组,红球:{1} + 蓝球:{2}"
msg = text.format(number, red_sample, blue)
print(msg)
if menu3 == "1":
red_lock = input("请输入您要锁定的红球号码,多个号码之间,请使用”+“加号间隔:")
red_lock_list = red_lock.split("+")
red_lock_set = set()
for num in red_lock_list:
red_lock_set.add(int(num))
red_dif = red_ball.difference(red_lock_set)
for i in range(cycle):
red_dif_sample = random.sample(red_dif, int(red_count) - len(red_lock_set))
red_sample = list(set(red_dif_sample).union(red_lock_set))
red_sample.sort(reverse=False)
blue = random.sample(blue_ball, int(blue_count))
blue.sort(reverse=False)
number = i + 1
text = "第{0}组,红球:{1} + 蓝球:{2}"
msg = text.format(number, red_sample, blue)
print(msg)
if menu3 == "2":
blue_lock = input("请输入您要锁定的蓝球号码,多个号码之间,使用“+”加号间隔:")
blue_lock_list = blue_lock.split("+")
blue_lock_set = set()
for num in blue_lock_list:
blue_lock_set.add(int(num))
blue_dif = blue_ball.difference(blue_lock_set)
for i in range(cycle):
blue_dif_sample = random.sample(blue_dif, int(blue_count) - len(blue_lock_set))
blue = list(set(blue_dif_sample).union(blue_lock_set))
blue.sort(reverse=False)
red_sample = random.sample(red_ball, int(red_count))
red_sample.sort(reverse=False)
number = i + 1
text = "第{0}组,红球:{1} + 蓝球:{2}"
msg = text.format(number, red_sample, blue)
print(msg)
if menu3 == "3":
blue_lock = input("请输入您要锁定的蓝球号码:")
blue_lock_list = blue_lock.split("+")
blue_lock_set = set()
for num in blue_lock_list:
blue_lock_set.add(int(num))
blue_dif = blue_ball.difference(blue_lock_set)
red_lock = input("请输入您要锁定的红球号码,多个号码间,请使用”+“加号间隔:")
red_lock_list = red_lock.split("+")
red_lock_set = set()
for num in red_lock_list:
red_lock_set.add(int(num))
red_dif = red_ball.difference(red_lock_set)
for i in range(cycle):
blue_dif_sample = random.sample(blue_dif, int(blue_count) - len(blue_lock_set))
blue = list(set(blue_dif_sample).union(blue_lock_set))
blue.sort(reverse=False)
red_dif_sample = random.sample(red_dif, int(red_count) - len(red_lock_set))
red_sample = list(set(red_dif_sample).union(red_lock_set))
red_sample.sort(reverse=False)
number = i + 1
text = "第{0}组,红球:{1} + 蓝球:{2}"
msg = text.format(number, red_sample, blue)
print(msg)
rc = int(red_count)
bc = int(blue_count)
nrc = rc * (rc - 1) * (rc - 2) * (rc - 3) * (rc - 4) * (rc - 5)
mrc = 1 * 2 * 3 * 4 * 5 * 6
price = nrc / mrc * bc * int(cycle) * 2 # 组合公式 从 n 中取 m 个数 = nrc / mrc;
print("彩票金额共计:%s元" % (price,)) # 打印彩票价格。