自學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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...