【python】32_生成器案例之聊天机器人

【摘要】相信读者通过阅读第一篇介绍生成器的博文之后,对生成器的工作机制以及生成器的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)

效果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值