編程、寫代碼屬於腦力勞動,做軟體開發似乎是個製作虛擬之物的工作,但電腦程序大都是用途明確的,而且好的程序都是很實用。
學python也講究學以致用,這點越早越好,我們現在就用python編個實用的程序來,不僅僅可以自家重複使用,而且可以發給別人用:給小學生生成口算題。
首先我們要把目標再具體、明確些 – 確定需求:
- 生成百以內的加減法口算題
- 一次運行,連續出10題供使用的人練習,一題一題地做;
- 如果有做錯的題目,把它們列印出來給使用的人看
按照 自學Python進階-把代碼變成程序,軟體 講的方式,我們將把實現這些功能的代碼全部放在一個文件里:mathExam.py。編寫完成後,你就可以把這個文件重複運行,多次使用,也可以發給同學家、好友用。
為了提高程序出題的效果,我們期望每次題目都會有大變化 – 編程里常稱為:隨機。這個功能可以使用python基礎庫里的: random庫,我們僅僅用裡面的 randint 函數來隨機生成一個整數。
這裡我們提到了編程上一個新概念:函數。Python程序代碼里的函數和數學書本上的函數,形式不同,但是功用十分類似。定義Python的一個函數格式如下:
def functionName(p1, p2, p3):
functionBody
return result其中的 def 是python的關鍵字,說明我們要開始定義一個函數了,而後面的 functionName是函數名字 – 這部分你可以自己想個名字的,後面括弧及其裡面逗號隔開的部分就是函數的參數 – 它們可以在使用函數時臨時一一提供,這樣即能重複利用它下面的代碼又能靈活變化,這正是函數的威力和魅力。
python代碼
函數是所有現代編程語言里最基本、最重要的代碼組織形式,代碼重複利用方式, 它在所有的軟體代碼里幾乎無處不在。前面提到的random庫裡面就提供好些隨機生成數據的函數,我們下面會用到裡面的 randint函數。
函數的 functionBody 部分就是我們要編碼實現功能的地方,最後的 return result 就是把我們工作的結果返回給使用我們函數的人。
就像python自身的基礎庫里有很多函數一樣,我們也可以在我們的mathExam.py里寫多個函數,用函數來組織我們的代碼。
首先 我們定義一個函數解決需求 1 的部分:
# 隨機生成一個口算題及其正確結果的函數
def genOneExercise():
opt = random.randint(0, 1) # 在0和1中隨機取一個值
if opt == 1: # 如果隨機得到的是 1,我們就生成加法口算題
a = random.randint(1, 99) # 注意這裡是 99
b = random.randint(1, 100-a) # 這是保證百以內加法的地方
result = a + b
return a, opt, b, result
else: # 如果隨機得到的是 0,我們就生成減法口算題
a = random.randint(1, 100)
b = random.randint(1, 100)
if a > b:
result = a - b
return a, opt, b, result
else:
result = b - a # 這裡是避免出現減數不夠的地方
return b, opt, a, result我們這個函數第一行的定義括弧里是空的,意味著使用它時不需要提供參數。這個函數每使用一次,程序員的說法是調用一次,就生成一個滿足上面需求1的結果。裡面的 randint(start, end)函數,調用它可以獲得一個數,這個數是從a開始(包含a)到b結束(包含b)的範圍里隨機選取的。
口算的題目和結果,我們存在一個元組裡了,並用1,0來分別表示加,減運算。我們不能把+,-符號存在變數里,因為這兩個符號在python語言里是特殊的類型符號,它們不同於數字或字元串類型的數據。所以隨機的加減運算在記錄、存儲到變數里時我們轉換了一下,同樣下面輸出提示時也要相應轉換。
下面看看需求2里的代碼長什麼樣:
def doExercises(times):
random.seed(time.time())
# 為了保障隨機效果,每次運行時給隨機系統一個變化的種子
errorList = []
i = 0
while i < times:
x, op, y, res = genOneExercise()
if op == 1:
tip = str(x) + ' + ' + str(y) + ' = '
else:
tip = str(x) + ' - ' + str(y) + ' = '
ret = int(input(tip)) # 注意把輸入的字元串類型轉換成數學計算的整型
if ret != res: # 只有口算結果錯了時才記錄
record = (x, op, y, res, ret) # 把一次口算錯誤的信息組織成一個元組
errorList.append( record )
i = i + 1
return errorList注意這個函數的定義我們指定了參數變數 times – 做口算題的次數,這樣我們在調用的地方就可以方便地規定一次做多少道口算題目了。這裡我們把口算的題目的提示轉換成字元串的日常數學式子後,放在python內部自帶的函數 input里當作參數:輸出到屏幕上,並等待你輸一個數字給程序。
我們把回答不對的口算題記錄在一個列表變數里,做完後就是把這個變數里的記錄信息輸出來查看 – 完成需求3的功能:
# 列印口算結果
def printErrors(errors):
if len(errors) > 0:
print("口算錯誤的題目:")
for error in errors:
a, op, b, result, yourInput = error
if op == 1:
tip = str(a) + ' + ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)
else:
tip = str(a) + ' - ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)
print(tip)
else:
print("恭喜你全部答對!")可以看到,這個函數末尾沒有return語句 – 我們不期望從它獲取什麼返回數據,讓它把信息直接輸出在屏幕上給我們看到即可。
到此我們把需求的3個功能都做完了,離可用起來還差一點:還必須把它們組織保持到文件里, 並在文件的執行入口裡調用(還記得 自學Python進階-把代碼變成程序,軟體 說明的地方么?)。
下面是代碼完整地放到文件里的樣子:
#!/usr/bin/env python3
import time # 這行代碼讓我們能夠使用python基礎庫的time庫里函數
import random # 這行代碼讓我們能夠使用python生成隨機數的函數
# 隨機生成一個口算題及其正確結果的函數
def genOneExercise():
opt = random.randint(0, 1) # 在0和1中隨機取一個值
if opt == 1: # 如果隨機得到的是 1,我們就生成加法口算題
a = random.randint(1, 99) # 注意這裡是 99
b = random.randint(1, 100-a) # 這是保證百以內加法的地方
result = a + b
return a, opt, b, result
else: # 如果隨機得到的是 0,我們就生成減法口算題
a = random.randint(1, 100)
b = random.randint(1, 100)
if a > b:
result = a - b
return a, opt, b, result
else:
result = b - a # 這裡是避免出現減數不夠的地方
return b, opt, a, result
# 做口算練習, 做的題目個數通過函數參數指定
def doExercises(times):
random.seed(time.time()) # 為了保障隨機效果,每次運行時給隨機系統一個變化的種子
errorList = []
i = 0
while i < times:
x, op, y, res = genOneExercise()
if op == 1:
tip = str(x) + ' + ' + str(y) + ' = '
else:
tip = str(x) + ' - ' + str(y) + ' = '
ret = int(input(tip)) # 注意把輸入的字元串類型轉換成數學計算的整型
if ret != res: # 只有口算結果錯了時才記錄
record = (x, op, y, res, ret) # 把一次口算錯誤的信息組織成一個元組
errorList.append( record ) i = i + 1
return errorList
# 列印口算結果
def printErrors(errors):
if len(errors) > 0:
print("口算錯誤的題目:")
for error in errors:
a, op, b, result, yourInput = error
if op == 1:
tip = str(a) + ' + ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)
else:
tip = str(a) + ' - ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)
print(tip)
else:
print("恭喜你全部答對!")
# 本文件執行時的入口 - 運行時從這裡開始
if __name__ == '__main__':
errors = doExercises(10) # 來 10個 口算題練練吧 :)
printErrors(errors) # 告訴我口算結果如何...試試把它用起來,你會遇到什麼問題么?歡迎留言,下次一起來解決你的問題,完善我們的口算出題器。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/274262.html
微信掃一掃
支付寶掃一掃