文章目錄

需求

朋友擔心小孩暑假玩瘋了,讓我弄點小學一年級數學題給小孩做,要求:

就是簡單的口算式子可以打印成 A4 紙有答案

根據要求,我覺得最簡單的辦法,就是生成一個內容用 tab 分隔開的 txt 文件,然后手工復制到排版好的 文件里面直接打印即可。

原始代碼

#coding: utf-8
"""本代碼來自第一感覺,使用函數實現。添加問題類型時,直接修改 main() 的 question_list 語句即可
"""
import random
def question_1():
    """生成 100 以內退位減法"""
    minuend = random.randint(11,98)
    units = minuend % 10
    while units==9 :
        minuend = random.randint(11,98)
        units = minuend % 10
    subtrahend = random.randint(units+1,9)
    answer = minuend - subtrahend
    return ("%d - %d = " % (minuend, subtrahend), str(answer))
def question_2():
    """生成兩位數加法"""
    num1 = random.randint(10, 99)
    num2 = random.randint(10, 99)
    answer = num1 + num2
    return ('%d + %d =' % (num1, num2), str(answer))
def question_3():
    """生成兩位數減兩位數"""
    minuend = random.randint(11,99)
    subtrahend = random.randint(10, minuend)
    answer = minuend - subtrahend
    return ("%d - %d = " % (minuend, subtrahend), str(answer))
def write_it(questions, answers, output_file):
    format_items(questions)
    format_items(answers)
    f = open(output_file, 'w')
    f.write("".join(questions))
    f.write("\n\n\n")
    f.write("".join(answers))
    f.close()
def format_items(items, number_per_line = 4):
    """用換行、tab 美化化輸出結果,方便之后導入 excel"""
    for i,a in enumerate(items):
        if i % number_per_line == number_per_line - 1:
            items[i] = a + "\n"
        else:
            items[i] = a + "\t"
def main(output_file, question_type = 1):
    """question_type取值:1 到 3 """
    questions = []
    answers = []
    question_generator = [question_1, question_2, question_3]
    for x in range(80):
        question, answer = question_list[question_type - 1]()
        print( question)
        questions.append(question)
        answers.append(answer)
    print("now write it")
    write_it(questions, answers, output_file)
if __name__ == '__main__':
    output_file = "out.txt"
    main(output_file)

引入 with 語句處理文件

以便在發生異常的時候自動關閉資源。將

f = open(output_file, 'w')
f.write("".join(questions))
f.write("\n\n\n")
f.write("".join(answers))
f.close()

改為

with open(output_file, 'w') as f:
    f.write("".join(questions))
    f.write("\n\n\n")
    f.write("".join(answers))

改成混合出題

單一類型題目指定生成,不如直接改成混合生成各類題型,并可以指定各種題型出現的概率。這可以直接利用 的 .() 函數實現,請注意該函數的返回值是個 list ,main() 函數修改如下:

def main(output_file, number = 80):
    ...
    question_generator = [question_1, question_2, question_3]
    for x in range(number):
        which = random.choices([1,2,3], [0.2, 0.4, 0.4])[0] # 各類型題目概率
        question, answer = question_generator[which-1]()
        ...

最終成果

最后,給每個題目添加序號,以便打印出來的題目可以快速找到答案。完整最終代碼如下:

#coding: utf-8
"""本代碼實現小學一年級數學題目(主要是100以內加減法)的自動出題
"""
# 下一步計劃:
#   - 添加網絡框架(比如 flask),實現在線測試網站
#       - 允許選擇難度、題型
#       - 自動匯總錯題
#       - 需要登錄,以便記錄每個人自己的練習情況
import random
def question_1():
    """生成 100 以內退位減法"""
    minuend = random.randint(11,98)
    units = minuend % 10
    while units==9 :
        minuend = random.randint(11,98)
        units = minuend % 10
    subtrahend = random.randint(units+1,9)
    answer = minuend - subtrahend
    return ("%d - %d = " % (minuend, subtrahend), str(answer))
def question_2():
    """生成兩位數加法"""
    num1 = random.randint(10, 99)
    num2 = random.randint(10, 99)
    answer = num1 + num2
    return ('%d + %d =' % (num1, num2), str(answer))
def question_3():
    """生成兩位數減兩位數"""
    minuend = random.randint(11,99)
    subtrahend = random.randint(10, minuend)
    answer = minuend - subtrahend
    return ("%d - %d = " % (minuend, subtrahend), str(answer))
def write_it(questions, answers, output_file):
    format_items(questions)
    format_items(answers)
    with open(output_file, 'w') as f:
        f.write("".join(questions))
        f.write("\n\n\n")
        f.write("".join(answers))
def format_items(items, number_per_line = 4):
    """用換行、tab 美化化輸出結果,并添加序號,方便之后導入 excel"""
    for i,a in enumerate(items, start=1):
        if i % number_per_line == 0:
            items[i-1] = str(i) + ".\t" + a + "\n"
        else:
            items[i-1] = str(i) + ".\t" + a + "\t"
def main(output_file, number = 80):
    """主函數"""
    questions = []
    answers = []
    question_generator = [question_1, question_2, question_3]
    for x in range(number):
        which = random.choices([1,2,3], [0.2, 0.4, 0.4])[0] # 各類型題目概率
        question, answer = question_generator[which-1]()
        print( question)
        questions.append(question)
        answers.append(answer)
    print("now write it")
    write_it(questions, answers, output_file)
if __name__ == '__main__':
    output_file = "out.txt"
    main(output_file, number=800)