【摘要】相信读者通过阅读第一篇介绍生成器的博文之后,对生成器的工作机制以及生成器的next、send方法有了大体的了解,这篇博文旨在运用一个非常简单的例子让读者加深对这些知识的理解。
需求:
实现一个可以与用户交互式聊天的简易机器人,例如可以询问机器人姓名、年龄等状况。
代码实现:
def chat_robot():
"""
聊天机器人
:return:
"""
# response: 存储的是机器人给用户的响应信息;
response = ''
while True:
# receive: 接收用户给机器人传过来的消息
receive = yield response
if '年龄' in receive:
response = "年龄保密"
elif '是谁' in receive or '姓名' in receive:
response = "我是聊天机器人Siri"
elif receive.endswith('吗?'):
response = receive[1:-2]
else:
response = '我听的不是很懂, 请换种说法'
# Robot是生成器(因为函数中包含yield关键字)
Robot = chat_robot()
# 调用next方法, 遇到yield停止
next(Robot)
# 用户可以一直给机器人发消息, 使用死循环
while True:
send_data = input("[用户potizo]>>: ")
if send_data == 'q' or send_data== 'quit':
print("机器人累了, 需要休息......下次再聊")
break
response = Robot.send(send_data)
print('[机器人]>>: ', response)
执行效果:
emmm…讲一边代码执行流程:
-
Robot = chat_robot(),调用函数之后,得到一个生成器Robot。
-
next(Robot),用next方法执行Robot这个生成器中的代码,直到遇到yield停止。很明显,程序停止在了 receive = yield response这一行
-
等待用户输入,将用户输入的内容存储在send_data中。
-
判断send_data中的内容,如果含有q或者quit,退出用户输入界面。
-
如果不含有q或者quit,将send_data中用户输入的内容,通过send方法传入生成器中,并赋值给上一个yield关键字赋值号左边的变量receive。继续执行代码,直到遇到下一个yield
-
receive变量中此时接收到了用户输入内容,对receive变量进行判断,给response变量赋相应的值,直到遇到下一个yield关键字(即 receive = yield response),将resopnse中的值返回,并赋值给生成器外部变量response(即 response = Robot.send(send_data))
-
最后打印这个生成器外部response变量的值
如果想要聊天机器人智能的话,我们可以调用一些API来实现,在下面的例子中,我们调用青云客聊天机器人的api。
可以参考接入指引来调用API:
代码实现如下:
注意使用到了requests和json模块
import requests
import json
def qingyun_api(kw):
url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg=%s' % (kw)
response = requests.get(url).text
result = json.loads(response).get('content','抱歉,无响应')
# print(result)
return result
def chat_robot():
"""
聊天机器人
:return:
"""
# response: 存储的是机器人给用户的响应信息;
response = ''
while True:
# receive: 接收用户给机器人传过来的消息
receive = yield response
if '年龄' in receive:
response = "年龄保密"
elif '是谁' in receive or '姓名' in receive:
response = "我是聊天机器人Siri"
elif receive.endswith('吗?'):
response = receive[1:-2]
else:
response = qingyun_api(receive)
if __name__ == '__main__':
Robot = chat_robot()
next(Robot)
while True:
send_data = input("[用户potizo]>>: ")
if send_data == 'q' or send_data == 'quit':
print("机器人累了, 需要休息......下次再聊")
break
response = Robot.send(send_data)
print('[机器人]>>: ', response)
效果如下: