自學Python第六天:實戰練習——機選雙色球

来源:https://www.cnblogs.com/timo521/archive/2022/09/08/16667797.html
-Advertisement-
Play Games

Python自學第六天:實戰練習——機選雙色球 我是一個編程小白,目前從事運維工作。 對於運維相關的技術,基本上都是瞭解點皮毛。 因為最近接觸自動化運維工具,看到很多工具都需要用到Python來寫腳本。 於是,利用業餘時間,開始自學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,))  # 列印彩票價格。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是跨域 當一個請求url的協議、功能變數名稱、埠三者之間任意一個與當前頁面url不同即為跨域。 跨域指的是瀏覽器不能執行其它網站的腳本。是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。 有一點必須要註意:跨域並不是請求發不出去,請求能發出去,服務端能收到請求並正常返回結果, ...
  • 在vue項目開發中,有時候會用到sessionStorge和localStorge兩個存儲,這兩個方法怎麼使用就不多敘述了,下麵之說在IOS中遇到的坑: 在登錄系統後需要用到sessionStorge存儲從後端返回的路由,以便下次重覆使用。但是在IOS中sessionStorge的容量是有限度的,遠 ...
  • 本項目主要基於`Elux+Antd`構建,包含React版本和Vue版本,旨在提供給大家一個簡單基礎、開箱即用的後臺管理系統通用模版,主要包含運行環境、腳手架、代碼風格、基本Layout、狀態管理、路由管理、增刪改查邏輯、列表、表單等。 ...
  • 前言 本文將對 Vue-Vben-Admin 角色許可權的狀態管理進行源碼解讀,耐心讀完,相信您一定會有所收穫! 更多系列文章詳見專欄 👉 📚 Vben Admin 項目分析&實踐 。 本文涉及到角色許可權之外的較多內容(路由相關)會一筆帶過,具體功能實現將在後面專題中詳細討論。為了更好的理解本文內 ...
  • JS實現數組扁平化處理 點擊打開視頻講解更加詳細 期望結果: 將數組扁平化並去重 最終得到一個升序且不重覆的數組 步驟: 1、數組扁平化 2、去重 3、排序 <template> <div id="home"> JS實現數組扁平化處理,妙不可言啊! <!-- 期望結果: 將數組扁平化並去重 最終得到 ...
  • 最近接到一個很有意思的需求,能否做到當內容橫向溢出時,依然能夠使用滑鼠滾輪對內容進行滾動的方法。 什麼意思呢?來看看這麼一種情況: 我們有一個垂直方向溢出滾動的容器,以及一個水平方向溢出滾動的容器: 如果使用的是非觸控板(大部分用戶沒有觸控板),而是使用滑鼠來進行操作,會發現,這兩個容器中,只有垂直 ...
  • 我因為最近在學習游戲開發相關知識,然後意識到自己設計模式知識缺乏,所以就去尋找相關書籍,這時候《游戲設計模式》這本書就跳到了我的眼前。 github上有大佬將這本書翻譯了,中文版閱讀地址在這:架構,性能和游戲 · Introduction · 游戲設計模式 (tkchu.me) 序章:架構,性能和游 ...
  • 原型模式(Prototype Pattern)是用於創建重覆的對象,同時又能保證性能。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...