目录
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
<iframe allowfullscreen="true" data-mediaembed="youku" frameborder="0" id="wo07FC7Y-1585989002954" src="https://player.youku.com/embed/XNDYxODg1NDIyMA=="></iframe>
程序运行结果演示
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)