python 初步实现人机对话

有点无聊,自己随便写了一个人机交互的程序。不存在任何智能,只是可以识别姓名,可以记录对话内容,并保存等到下一次交互时加载。(推荐面向对象版本

已经发布到Github: [assistant](https://github.com/Freakwill/assistant)

 

# hello.py
# 这是老早写的。不过今天加入了Pickle,然后润色了一下。
# 可能有点无聊(不推荐使用)

import pickle
import os.path

def search(x, data):
    for k, d in enumerate(data):
        if x == d['name']:
            return k, d

def save_data(A,pklname):
    with open(pklname, 'wb') as pkl:
        pickle.dump(A, pkl)

def load_data(pklname):
    with open(pklname, 'rb') as pkl:
        return pickle.load(pkl)

# communicating with computer
data=[] if not os.path.isfile('data') else load_data('data')

while True:
    print('Welcome! [type "quit" if you want to quit.]')
    name=input('--What is your name?\n--')
    if name in {'quit','Quit','q','Q'}:
        print('[You quit]')
        break
    if not search(name, data):
        print('--Welcome, '+name+ '. I will remember you name.')
        d={'name':name,'age':0,'history':[]}
        data.append(d)
    else:
        print('--Hi, '+name+'. How I miss you.')

    k, d=search(name, data)
    while d['age']==0:
        age=input('--How old are you?[I will repeat until you respond!]')
        try:
            if int(age)==0: continue
            d['age']=int(age); data[k]=d
        except:
            pass
    while True:
        y=input('--Chan I help you? [yes/no]')
        while not y:    
            y=input('--Yes or no?')
        d['history'].append(y); data[k]=d
        if y in {'no','No','n','N'}:
            print('--%s.'%y)
            print('--Bye bye.')
            break
        elif y in {'yes','Yes','y','Y'}:
            print('--%s.'%y)
            print('I am pleased to serve you.')        
        else:
            print('I am sorry. I can not understand what you said.')
            break       

# save data
y=input('--Do you want to save the data? [yes/no]')
while not y:    
    y=input('--Yes or no?')               
if y in {'no','No','n','N'}:
    print('--%s. [You say no.]'%y)
elif y in {'yes','Yes','y','Y'}:
    print('--%s. [the data is saved in file named "data".]'%y)
    save_data(data, 'data')
else:
    print('I am sorry. I can not understand what you said. data are not saved.')

    


下面是hello.py的面向对象编程版本(推荐)

 

 

 

# hello.py

import pickle
import os.path

def search(x, data):
    for k, d in enumerate(data):
        if x == d['name']:
            return k, d

class Hello:
    def __init__(self, name='', data=None):
        self.name = name
        self.data = data

    def __getstate__(self):
        return self.data

    def __setstate__(self, data):
        self.data = data

    def mainloop(self):

        while True:
            print('Welcome! [type "quit" if you want to quit.]')
            name=input('--What is your name?\n--')
            if name in {'quit','Quit','q','Q'}:
                print('[You quit]')
                break
            if not search(name, self.data):
                print('--Welcome, '+name+ '. I will remember you name.')
                d={'name':name,'age':0,'history':[]}
                self.data.append(d)
            else:
                print('--Hi, '+name+'. How I miss you.')

            k, d=search(name, self.data)
            while d['age']==0:
                age=input('--How old are you?[I will repeat until you respond!]')
                try:
                    if int(age)==0: continue
                    d['age']=int(age); self.data[k]=d
                except:
                    pass
            while True:
                y=input('--Chan I help you? [yes/no]')
                while not y:
                    y=input('--Yes or no?')
                d['history'].append(y); self.data[k]=d
                if y in {'no','No','n','N'}:
                    print('--%s.'%y)
                    print('--Bye bye.')
                    break
                elif y in {'yes','Yes','y','Y'}:
                    print('--%s.'%y)
                    print('I am pleased to serve you.')
                else:
                    print('I am sorry. I can not understand what you said.')
                    break

        # save data
        y=input('--Do you want to save the data? [yes/no]')
        while not y:
            y=input('--Yes or no?')
        if y in {'no','No','n','N'}:
            print('--%s. [You say no.]'%y)
        elif y in {'yes','Yes','y','Y'}:
            print('--%s. [the data is saved in file named "data.pkl".]'%y)
            with open('data.pkl', 'wb') as fo:
                pickle.dump(self, fo)
        else:
            print('I am sorry. I can not understand what you said. data are not saved.')
        # communicating with computer


try:
    with open('data.pkl', 'rb') as fo:
        hello=pickle.load(fo)
except:
    hello=Hello('ai',[])

hello.mainloop()

 

 

 

你可能感兴趣的:(python)