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)