實例筆記之生成隨機號碼
擴展知識 - yield(生成器)
隨機生成驗證碼
示例代碼:
import random # 導入標准模塊中的random
if __name__ == '__main__':
check_code = "" # 保存驗證碼的變量
for i in range(4): # 循環4次
index = random.randrange(0, 4) # 隨機生成0~3中的一個數
if index != i and index+1 != i: # 從此開始就是隨機生成一個字符或數字(不知道上面代碼到底產生了幾(因為隨機),也不需要知道,反正結果能出4個字符驗證碼即可)
check_code += chr(random.randint(97, 122)) # 隨機生成a~z中的一個小寫字母
elif index+1 == i:
check_code += chr(random.randint(65, 90)) # 隨機生成A~Z中的一個大寫字母
else:
check_code += str(random.randint(1, 9)) # 隨機生成1~9中的一個數字
print("驗證碼:", check_code) # 輸出生成的驗證碼
執行結果:
驗證碼: xufz # 隨機不一定是這個
以上是生成4位隨機驗證碼示例代碼,需要位數更多改一下數字即可。
生成大樂透號碼
原始代碼:
"""
輸入注數生成大樂透號碼
紅球取值范圍1-36,籃球1-12
"""
import random
class GreatLotto:
"""
需要一個生成次數count
"""
global result # 聲明全局變量
result = []
def __init__(self, count):
self.count = count
def randoms(self):
"""
:return: 返回傳入次數的隨機彩票號碼(返回的是一個整體列表)
"""
for i in range(self.count):
for j in range(7):
if j <= 4:
index1 = random.randrange(1, 36)
result.append(index1)
if j > 4:
index1 = random.randrange(1, 13)
result.append(index1)
return result # 返回生成結果
def start(self):
"""
:return: 根據傳入的次數判斷列表取值的開始數
"""
for l in range(self.count):
if l < 1:
two = l
else:
two = l * 7
yield two # yield是生成器,將每次循環生成的結果儲存(如果使用了return會結束循環,導致只能執行一次)
def ends(self, rer):
"""根據傳入的次數判斷列表取值的結束數"""
for k in range((len(rer) + 1) // 7): # 小數不能循環我們用地板除
one = (k + 1) * 7
yield one # yield是生成器,將每次循環生成的結果儲存(如果使用了return會結束循環,導致只能執行一次)
if __name__ == '__main__':
num = int(input("請輸入需要生成的注數:"))
Great = GreatLotto(num) # 實例化GreatLotto 並將輸入的次數傳入
lists = Great.randoms() # 得到返回的生成結果
zips = zip(Great.start(), Great.ends(lists)) # 壓縮兩個函數 使for循環可以同時循環兩個對象
for m, n in zips: # 遍歷兩個函數的生成器
print(lists[m:n])
執行結果:
請輸入需要生成的注數:3
[6, 15, 9, 34, 9, 8, 8]
[17, 18, 6, 15, 6, 5, 2]
[9, 29, 23, 22, 32, 1, 8]
改進版本:
"""
輸入注數生成大樂透號碼
紅球取值范圍1-36,籃球1-12
"""
import random
class GreatLotto:
"""
需要一個生成次數count
"""
global result # 聲明全局變量
result = []
def __init__(self, count):
self.count = count
def randoms(self):
"""
:return: 返回傳入次數的隨機彩票號碼(返回的是一個整體列表)
"""
for i in range(self.count):
for j in range(7):
if j <= 4:
index1 = random.randrange(1, 36)
result.append(index1)
if j > 4:
index1 = random.randrange(1, 13)
result.append(index1)
return result # 返回生成結果
def start_end(self):
"""
:return: 根據傳入的次數判斷列表取值的開始數和結束數
"""
for k in range(self.count):
if k < 1:
start1 = k
else:
start1 = k * 7
end1 = start1 + 7
yield end1, start1 # yield是生成器,將每次循環生成的結果儲存(如果使用了return會結束循環,導致只能執行一次)
if __name__ == '__main__':
try:
num = int(input("請輸入需要生成的注數:"))
except ValueError:
print('輸入的格式錯誤!!!')
num = int(input("請重新輸入需要生成的注數:"))
Great = GreatLotto(num) # 實例化GreatLotto 並將輸入的次數傳入
lists = Great.randoms() # 得到返回的生成結果
for end, start in Great.start_end(): # 遍歷兩個函數的生成器
print(lists[start:end]) # 輸出最終生成的結果
執行結果:
請輸入需要生成的注數:3
[32, 27, 30, 2, 28, 10, 11]
[25, 20, 15, 11, 34, 3, 3]
[15, 11, 8, 15, 26, 7, 5]