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