嗨,大家好呀。大家在生活中应该接触过很多形形色色的问答机器人叭。例如,小爱同学、天猫精灵、小度......等等。那么大家有没有想过如何通过Python来编写出来简易的问答机器人呢?今天,它就来喽。
1.使用列表做一个简单的问答机器人
首先,我们需要创建一个嵌套列表,每个并集列表中包含一个问题和一个答案:
qa_list = [
["你好", "你好呀!"],
["今天天气怎么样", "我不知道今天的天气呢。"],
["你叫什么名字", "我是问答机器人。"]
]
然后,创建循环使我们可以不断的提问,通过循环遍历列表中的每一个子列表,判断用户输入的问题是否与子列表中的第一个元素匹配,如果匹配则输出对应的第二个元素作为答案,否则输出 “我不知道这个问题的答案。”。
while True:
question = input("请提问:")
found_answer = False
for pair in qa_list:
if pair[0] == question:
print(pair[1])
found_answer = True
break
if not found_answer:
print("我不知道这个问题的答案。")
2.使用字典中的键值对来实现
这里我们利用字典的(count = {key1:value1})中key(键)是独一无二的和value(值)可重复的的特性写一个简易问答机器人。
首先,创建一个包含问题(key)和答案(value)的字典
q_Answer = {
"你好": "你好呀!",
"今天天气怎么样": "我不知道今天的天气呢。",
"你叫什么名字": "我是问答机器人。"
}
然后,通过while循环获取用户输入的问题(相当于键)去获取字典中的值,通过print函数输出就可以了。
while True:
question = input("您好,请说出您的问题:")
# 判断用户输入的问题是否在字典中,通过键去获取值。
if question in q_Answer:
print(q_Answer[question])
else:
print("我暂时回答不了这个问题,等我再努力一些叭")
3.使用字典结合match...case语句(进阶)
注:在 Python 3.10 及以上版本中支持 match...case
语句
我们学会了字典的问答机器人的写法之后,大大提升了代码的可读性以及减少了代码量,那么我们就可以结合第三方库来做一个获取实时信息的问答机器人,这里以获取当前时间datetime模块为例
from datetime import datetime
# 定义问题与答案的字典
qa_dict = {
"你好": "你好呀!",
# 对于“今天天气怎么样”的回答,表示不知道今天的天气,这一部分大家可以自己研究一下如何获取实时天气
"今天天气怎么样": "我不知道今天的天气呢。",
"你叫什么名字": "我是问答机器人。",
# 对于“现在几点了”的回答是一个匿名函数,调用它会返回当前时间的格式化字符串
"现在几点了": lambda: datetime.now().strftime('%H:%M:%S')
}
# 获取用户输入的问题
question = input("请提问:")
# 使用 match...case 语句进行问题匹配
match question:
# 如果问题在字典中
case key if key in qa_dict:
answer = qa_dict[key]
# 如果答案是可调用的(如匿名函数)
if callable(answer):
# 调用可调用对象并打印结果
print(answer())
else:
# 直接打印答案字符串
print(answer)
# 如果没有匹配到任何问题
case _:
print("我不知道这个问题的答案。")
让我们来康康运行结果叭。
当然,我们也可以通过第三方库来实现文字转语音效果,例如,pyttsx3。
from datetime import datetime
import pyttsx3
def text_to_speech_pyttsx3(text, rate):
engine = pyttsx3.init()
# 获取当前语音速率
current_rate = engine.getProperty('rate')
# 设置新的语音速率
engine.setProperty('rate', current_rate + rate)
engine.say(text)
engine.runAndWait()
qa_dict = {
"你好": "你好呀!",
"今天天气怎么样": "我不知道今天的天气呢。",
"你叫什么名字": "我是问答机器人。",
"现在几点了": lambda: datetime.now().strftime('%H:%M:%S')
}
question = input("请提问:")
match question:
case key if key in qa_dict:
answer = qa_dict[key]
text_to_speech_pyttsx3(answer, 50)
if callable(answer):
print(answer())
else:
print(answer)
case _:
print("我不知道这个问题的答案。")