草庐IT

自学Python第六天:实战练习——机选双色球

奔放热带鱼在家刷剧 2023-04-17 原文

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,))  # 打印彩票价格。

有关自学Python第六天:实战练习——机选双色球的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  6. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  7. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  10. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

随机推荐