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)
发布了18 篇原创文章 · 获赞 257 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/105307335