Python每日一練(5)-百詞斬

1. 單詞背記

英語是目前世界上使用最廣泛的語言之一,也是國際上通用的語言。隨着各國交流越來越頻繁,英語的地位與日俱增。在中國,已經有成千上萬的人加入到英語學習大軍中,英語對於我們來說已經是一門不可或缺的技能,但英語單詞記憶是一大難題。請編寫一個程序,幫助學習者快速背記英語單詞。運行程序,隨機輸出英語單詞的漢語意思,要求寫出或說出英文。運行效果如下圖所示。
在這裏插入圖片描述
示例代碼如下:

import random

# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "電腦": "computer",
             "成語": "idiom",
             "價格": "price",
             "年齡": "age",
             "商店": "shop"}
word_list = list(word_dict)
print("**************百詞斬**************")
while True:
    terms = random.choice(word_list)  # terms: 詞語
    print("漢語:", terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    if word == value:
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{value}\033[0m")
        print("要加油呀~")

下面對其中的一些語法進行說明:
在這裏插入圖片描述

2. 單詞提醒

爲百詞斬程序添加提示功能和退出功能。運行程序,用戶輸入?號(中英文問好均可以)要求對單詞進行提示,程序隨機輸出單詞的前兩個字母或後兩個字母進行提示。用戶輸入q或者Q,提示正在退出程序!!並退出程序。運行效果如下圖所示。
在這裏插入圖片描述
示例代碼如下:

import random


def equal(str_a, str_b):
    if str_a.strip() == str_b.strip():  # str_a: 用戶輸入的英文單詞  str_b: 字典中的英文單詞
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{str_b}\033[0m")
        print("要加油呀~")


# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "電腦": "computer",
             "成語": "idiom",
             "價格": "price",
             "年齡": "age",
             "商店": "shop"}
word_list = list(word_dict)
print("**************百詞斬**************")
while True:
    terms = random.choice(word_list)  # terms: 詞語
    print("漢語:", terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    # 判斷總的分爲三類: 1.輸入q 2.輸入? 3.輸入正常單詞
    if word.lower() == "q":
        print("正在退出程序!!!")
        break
    elif word in ["?", "?"]:
        tips_list = [value[:2], value[-2:]]  # 用列表將單詞前兩個字母和後兩個字母存儲
        tips = random.choice(tips_list)  # 隨機取出提示字母
        if tips_list.index(tips) == 0:
            print(f"\033[1;31m提示:\033[0m 單詞前兩個字母是: {tips}")
        else:
            print(f"\033[1;31m提示:\033[0m 單詞後兩個字母是: {tips}")
        word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
    else:
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致

3. 記憶功能

爲百詞斬添加記憶功能。用戶答對的單詞,不再重複出現。答錯的單詞和未出現的單詞繼續隨機輸出。當所有單詞全部答完,提示你真棒,今天任務全部過關!!並退出程序。運行效果如圖所示。
在這裏插入圖片描述
示例代碼如下:

import random


def equal(str_a, str_b):
    if str_a.strip() == str_b.strip():  # str_a: 用戶輸入的英文單詞  str_b: 字典中的英文單詞
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
        word_dict.pop(terms)
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{str_b}\033[0m")
        print("要加油呀~")


# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "年齡": "age",
             "商店": "shop"}  # 爲了測試方便 刪減一部分單詞

print("**************百詞斬**************")
while len(word_dict):
    terms = random.choice(list(word_dict))  # terms: 詞語
    print("漢語:", terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    # 判斷總的分爲三類: 1.輸入q 2.輸入? 3.輸入正常單詞
    if word.lower() == "q":
        print("正在退出程序!!!")
        break
    elif word in ["?", "?"]:
        tips_list = [value[:2], value[-2:]]  # 用列表將單詞前兩個字母和後兩個字母存儲
        tips = random.choice(tips_list)  # 隨機取出提示字母
        if tips_list.index(tips) == 0:
            print(f"\033[1;31m提示:\033[0m 單詞前兩個字母是: {tips}")
        else:
            print(f"\033[1;31m提示:\033[0m 單詞後兩個字母是: {tips}")
        word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
    else:
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
else:
    print("你真棒,今天任務全部過關!!!")

下面對其中的一些語法進行說明:
在這裏插入圖片描述

4. 語音朗讀

爲百詞斬添加語音朗讀功能。運行程序,在輸出漢語單詞的同時,語音播報漢語單詞,答對了,語音播報答對了, 你真棒!!,答錯了,語音播報答錯了,正確答案是朗讀正確英語單詞, 加油啊!!,按q鍵退出程序時語音播報正在退出程序!!。整個單詞背記結束時語音播報你真棒,今天任務全部過關!! 注意:完成此任務需要導入第三方模塊,導入模塊命令,在Mac系統下爲:

 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pyttsx3
 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pyobjc

Windows系統下爲:

pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pywin32

程序運行結果演示

Mac系統下,示例代碼爲:

import random
import pyttsx3


def speak(sp_str):
    engine = pyttsx3.init()
    engine.say(sp_str)
    engine.runAndWait()


def equal(str_a, str_b):
    if str_a.strip() == str_b.strip():  # str_a: 用戶輸入的英文單詞  str_b: 字典中的英文單詞
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
        speak("答對了,你真棒!!!")
        word_dict.pop(terms)
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{str_b}\033[0m")
        speak("答錯了,正確答案:" + str_b + "加油啊!!!")
        print("要加油呀~")


# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "年齡": "age",
             "商店": "shop"}  # 爲了測試方便 刪減一部分單詞

print("**************百詞斬**************")
while len(word_dict):
    terms = random.choice(list(word_dict))  # terms: 詞語
    print("漢語:", terms)
    speak("漢語:" + terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    # 判斷總的分爲三類: 1.輸入q 2.輸入? 3.輸入正常單詞
    if word.lower() == "q":
        print("正在退出程序!!!")
        speak("正在退出程序!!!")
        break
    elif word in ["?", "?"]:
        tips_list = [value[:2], value[-2:]]  # 用列表將單詞前兩個字母和後兩個字母存儲
        tips = random.choice(tips_list)  # 隨機取出提示字母
        if tips_list.index(tips) == 0:
            print(f"\033[1;31m提示:\033[0m 單詞前兩個字母是: {tips}")
        else:
            print(f"\033[1;31m提示:\033[0m 單詞後兩個字母是: {tips}")
        word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
    else:
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
else:
    print("你真棒,今天任務全部過關!!!")
    speak("你真棒,今天任務全部過關!!!")

Windows系統下,示例代碼爲:

import random
import winsound
from win32com.client import Dispatch



def speak(sp_str):
    speak_out.speak(sp_str)
    winsound.PlaySound(sp_str, winsound.SND_ASYNC)


def equal(str_a, str_b):
    if str_a.strip() == str_b.strip():  # str_a: 用戶輸入的英文單詞  str_b: 字典中的英文單詞
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
        speak("答對了,你真棒!!!")
        word_dict.pop(terms)
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{str_b}\033[0m")
        speak("答錯了,正確答案:" + str_b + "要加油呀!!!")
        print("要加油呀~")


# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
speak_out = Dispatch('sapi.spvoice')
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "年齡": "age",
             "商店": "shop"}  # 爲了測試方便 刪減一部分單詞

print("**************百詞斬**************")
while len(word_dict):
    terms = random.choice(list(word_dict))  # terms: 詞語
    print("漢語:", terms)
    speak("漢語:" + terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    # 判斷總的分爲三類: 1.輸入q 2.輸入? 3.輸入正常單詞
    if word.lower() == "q":
        print("正在退出程序!!!")
        speak("正在退出程序!!!")
        break
    elif word in ["?", "?"]:
        tips_list = [value[:2], value[-2:]]  # 用列表將單詞前兩個字母和後兩個字母存儲
        tips = random.choice(tips_list)  # 隨機取出提示字母
        if tips_list.index(tips) == 0:
            print(f"\033[1;31m提示:\033[0m 單詞前兩個字母是: {tips}")
        else:
            print(f"\033[1;31m提示:\033[0m 單詞後兩個字母是: {tips}")
        word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
    else:
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
else:
    print("你真棒,今天任務全部過關!!!")
    speak("你真棒,今天任務全部過關!!!")

5. 積分評價

爲百詞斬添加背記積分功能。背記單詞時,單詞一次答對積3分,利用提示答對不積分。答錯後,後續答對積1分。最高積分爲24分,最低積分爲8分。20分及以上爲優秀16-19分爲良好12-15分爲及格12分以下爲不及格。背記單詞完成時播報選手的得分和評價。運行效果如視頻所示。

程序運行結果演示

考慮到大多數人使用的是windows系統,筆者這裏主要給出在windows系統下的示例代碼:

import random
import winsound
from win32com.client import Dispatch



def speak(sp_str):
    speak_out.speak(sp_str)
    winsound.PlaySound(sp_str, winsound.SND_ASYNC)


def equal(str_a, str_b):
    global score
    if str_a.strip() == str_b.strip():  # str_a: 用戶輸入的英文單詞  str_b: 字典中的英文單詞
        print(f"\033[0;32m{chr(8730)}\033[0m 你真棒!!!")
        speak("答對了,你真棒!!!")
        word_dict.pop(terms)
        if terms in word_set:
            score += 1
        else:
            score += 3
    else:
        print(f"\033[0;31m{chr(215)}\033[0m 答錯了,正確答案: \033[0;31m{str_b}\033[0m")
        speak("答錯了,正確答案:" + str_b + "要加油呀!!!")
        print("要加油呀~")
        word_set.add(terms)


# 思考: 一箇中文對應一個英語單詞,用什麼數據類型存儲好呢?
# 答: 字典 key(中文) --> value(英文)
speak_out = Dispatch('sapi.spvoice')
word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "年齡": "age",
             "商店": "shop",
             "我們": "we",
             "價格": "price",
             "書": "book",
             "電腦": "computer"}
score = 0  #  用於統計分數
word_set = set()  # 用於存儲第一次答錯的單詞
print("**************百詞斬**************")
while len(word_dict):
    terms = random.choice(list(word_dict))  # terms: 詞語
    print("漢語:", terms)
    speak("漢語:" + terms)
    value = word_dict.get(terms).strip()  # 從字典中獲取中文所對應的英文單詞
    word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
    # 判斷總的分爲三類: 1.輸入q 2.輸入? 3.輸入正常單詞
    if word.lower() == "q":
        print("正在退出程序!!!")
        speak("正在退出程序!!!")
        break
    elif word in ["?", "?"]:
        tips_list = [value[:2], value[-2:]]  # 用列表將單詞前兩個字母和後兩個字母存儲
        tips = random.choice(tips_list)  # 隨機取出提示字母
        if tips_list.index(tips) == 0:
            print(f"\033[1;31m提示:\033[0m 單詞前兩個字母是: {tips}")
        else:
            print(f"\033[1;31m提示:\033[0m 單詞後兩個字母是: {tips}")
        word = input("英語: ").strip()  # 防止用戶誤操作錄入空白
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
    else:
        equal(word, value)  # 調用函數 比較用戶輸入的單詞和字典中的單詞是否一致
else:
    if score >= 20:
        start = "優秀"
    elif score >= 16:
        start = "良好"
    elif score >= 12:
        start = "及格"
    else:
        start = "不及格"
    print(f"你的得分爲{score}, 成績{start}")
    speak("你的得分爲: " + str(score) + "成績" + start)

6. 默寫輸出

給百詞斬增加默寫輸出功能。通過電腦進行單詞背誦雖然效果較好,但如果能夠將單詞輸出,對視力會降低影響。可以將單詞以默寫方式打印到紙上,用戶可以方便的背誦和默寫練習。要求程序可以通過輸入設置每個單詞打印默寫空格數(1-6個默寫空格),運行效果如圖所示。
在這裏插入圖片描述
在這裏插入圖片描述
示例代碼如下:

word_dict = {"手機": "mobile phone",
             "美女": "beauty",
             "年齡": "age",
             "商店": "shop",
             "我們": "we",
             "價格": "price",
             "書": "book",
             "電腦": "computer"}


print("**************百詞斬**************")

blank_num = int(input("輸入打印默認的空格數(1-6): ").strip())
# 獲取字典中所有的key/value 並存入到列表中
key_list = list(word_dict)
value_list = list(word_dict.values())

max_len_key = max(list(map(len, key_list))) * 2  # 一箇中文佔用兩個英文字母的位置
max_len_value = max(list(map(len, value_list)))
max_len = max_len_value if max_len_value > max_len_key else max_len_key  # 取出英文和中文的長度最大值
file = open("word.txt", "a", encoding="utf-8")

file.write("英語默寫\n")
for key in word_dict.keys():
    if len(key)*2 < max_len:
        key = key + " " * (max_len-len(key)*2)
    print(key + " \t"+ "______________  " * blank_num)  # 一般來說英文的長度肯定比中文長
    content = key + " \t"+ "______________  " * blank_num + "\n"
    file.write(content)

file.write("\n漢字默寫\n")
for value in word_dict.values():
    if len(value) < max_len:
        value = value + " " * (max_len-len(value))
    print(value + " \t"+ "______________  " * blank_num)
    content = value + " \t" + "______________  " * blank_num + "\n"
    file.write(content)

7. 詞彙獲取

本實例通過字典提供了少量練習用的英語單詞,如果要實際應用,如果能從文件中導入單詞,就非常方便實用了。下面編寫一個可以按單元從文本文件導入英語單詞的程序,文本中的英文和漢語中間用英文空格間隔。在導入過程中,刪除單詞前的.以及空格等。導入前的文本以及導入字典的效果如圖所示。
在這裏插入圖片描述
在這裏插入圖片描述
示例代碼如下:

eng = {}
with open('unit1.txt', 'r', encoding='UTF-8') as file:
    while True:
        line = file.readline()
        if line == '':
            break
        group = line.split()
        new = [i for i in group if i.strip() != '']
        if len(new) == 2:
            word_eng = new[0].lstrip(".")
            eng[new[1]] = word_eng
        else:
            for i in range(len(new)):
                if ord(new[i][0]) > 255:
                    word_eng = ' '.join(new[0:i])
                    word_eng = word_eng.lstrip(".")
                    word_han = ' '.join(new[i:])
                    break
            eng[word_han] = word_eng
print(eng)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章