Python 対話型ロボット

Python学習【365日チャレンジ!】102日目のマスターU(@Udemy11)です。

昨日で、一通りの入門編が終了して、今日から実践編ということで、簡単な対話アプリケーションを作成していきます。

これまでは、レクチャーで教えてもらった内容を繰り返して実践するスタイルでしたが、今回は、提示された課題を自分で考えてコードを書いてみて、課題の通りの動きを再現することが目標になります。

コードに正解はないので、どんなコードを書けば、指定されたとおり動くのかを自分で考えてやってみることが重要なので、失敗を恐れず、実践していこうと思います。

それでは今日もPython学習にはいりましょう!

昨日の復習

昨日は、datetimeモジュールとtimeモジュールについて学習しました。

datetimeモジュールは、現在日時を取得して、独自フォーマットで表示することもできました。

import datetime

now = datetime.datetime.now()
print(now)
print(now.isoformat())
print(now.strftime('%y/%m/%d-%H:%M:%S'))

出力結果

2020-05-22 20:2:355.239749
2020-05-22T20:23:355.239749
20/05/22-20:23:55

一方で、timeモジュールは、時間単位を扱うモジュールで、time.sleep()関数で数秒後に次の操作をさせることができました。

import time

print('start')
time.sleep(1)
print('end')

これは、startが出力されて1秒後にendが出力されるコードです。

日時に関しては、大抵のアプリで利用されているので、非常に使用頻度の高いモジュールだと言えます。

詳しくは、昨日の記事を参考にしてください。

それでは、本日の学習に入っていきましょう!

対話型アプリケーション

第一弾の課題は、対話型アプリケーションの作成です。
ロボットのジャービスが質問をしてきて、その質問に答えると、次の質問をしたり、保存されたデータの中からおすすめを提示したりして、好きなスポーツを収集していきます。

最初は質問をしてデータを取得するだけですが、2人目以降は、保存されているデータや回答によって、質問の中身や次の質問が変わるようになっています。

質問が終わったあとには、CSVファイルが更新されているというやり取りを一つのPythonファイルでできるようにします。

フォルダ構造としては、次のような感じです。

jarvis ┳ main.py
       ┗ ranking.csv(1人目回答後に作成される)

ということで、最終的には4人の人に回答してもらい、データを蓄積していきますので、最終的にこうなるという流れを見ていきます。

1人目のやり取り

JarvisJarvis

こんにちは。私はジャービスです。あなたの名前を教えてください。


MasterUMasterU

MasterU


JarvisJarvis

MasterUさん、あなたの好きなスポーツは何ですか?
英語で答えてください。


MasterUMasterU

baseball


JarvisJarvis

MasterUさん、回答ありがとうございました。
良い1日をお過ごしください。

保存される【ranking.csv】

NAME,COUNT
Baseball,1

まずは、ロボットのジャービスが質問して、入力を待ちます。

自分の名前を入力したあと、さらにジャービスが答えた名前の頭文字を大文字にして、名前を言ったあと、好きなスポーツをききます。

日本語だと、ひらがな、カタカナ、漢字になってしまい、同じスポーツにするには一工夫必要なため、今回は英語で答えます。
入力したデータは、頭文字を大文字にしておきます。

最後に、ジャービスが名前の頭文字を大文字にして名前を言ったあと、お礼を述べます。

main.pyを終了したときには、データの入ったranking.csvが同じ階層に作成されるようにします。

これが一人目の処理になります。

続いて、同じmain.pyをもう一度開いて、次の人に質問をします。

2人目のやり取り

JarvisJarvis

こんにちは。私はジャービスです。あなたの名前を教えてください。


隼人隼人

hayato


JarvisJarvis

私のおすすめのスポーツは、Baseballです。
あなたはこのスポーツが好きですか? [Yes/No]


隼人隼人

No


JarvisJarvis

Hayatoさん、あなたの大好きなスポーツはなんですか?
英語で答えてください。


隼人隼人

volleyball


JarvisJarvis

Hayatoさん、回答ありがとうございました。
良い1日をお過ごしください。

保存される【ranking.csv】

NAME,COUNT
Baseball,1
Volleyball,1

基本的に2人目以降も最初の質問は同じで、名前を聞いてきます。

1人目と違うのは、ranking.csvに保存されたデータから、おすすめのスポーツを提示して、そのスポーツが好きかどうか、YesNoで答えてもらいます。

このときの回答は、YesでもYESでも、Yでもyでも構いません。Noの場合も同様です。

もし、それ以外の回答の場合は、次のように聞き返してきます。

JarvisJarvis

Yes か Noで答えてください。

きちんとYesNoを返せたら、次の質問に移ります。

次の質問は、一人目のときと同じで、その回答がranking.csvにあれば、そのスポーツ名のCOUNTに1を加えてCSVの値を変更します。

最後は、1人目同様のお礼で終了します。

3人目は、もう少し複雑です。

3人目のやり取り

JarvisJarvis

こんにちは。私はジャービスです。あなたの名前を教えてください。


さやさや

saya


JarvisJarvis

わたしがおすすめするスポーツは、Baseballです。
あなたはこのスポーツが好きですか? [Yes/No]


さやさや

No


JarvisJarvis

わたしがおすすめするスポーツは、Volleyballです。
あなたはこのスポーツが好きですか? [Yes/No]


さやさや

Yes


JarvisJarvis

Sayaさん、あなたの大好きなスポーツはなんですか?
英語で答えてください。


さやさや

Volleyball


JarvisJarvis

Sayaさん、回答ありがとうございました。
良い1日をお過ごしください。

保存される【ranking.csv】

NAME,COUNT
Baseball,1
Volleyball,2

2人目と同じように、名前を聞かれて答えると、おすすめのスポーツを提示してきます。

2人目と違うのは、ranking.csvのデータが2つになっているので、1回目のおすすめへの回答がYesであれば、大好きなスポーツを聞く質問を表示しますが、Noだった場合は、2つ目のスポーツをおすすめにして好きか嫌いかを聞いてきます。

最終的には、1人目2人目と同じお礼のあいさつで終了し、ranking.csvのデータはValleyballCOUNT2になっています。

4人目のやり取り

JarvisJarvis

こんにちは。私はジャービスです。あなたの名前を教えてください。


ゆみこゆみこ

Yumiko


JarvisJarvis

わたしがおすすめするスポーツは、Volleyballです。
あなたはこのスポーツが好きですか? [Yes/No]


ゆみこゆみこ

n


JarvisJarvis

わたしがおすすめするスポーツは、Baseballです。
あなたはこのスポーツが好きですか? [Yes/No]


ゆみこゆみこ

N


JarvisJarvis

Yumikoさん、あなたの大好きなスポーツはなんですか?
英語で答えてください。


ゆみこゆみこ

softball


JarvisJarvis

Yumikoさん、回答ありがとうございました。
良い1日をお過ごしください。

保存される【ranking.csv】

NAME,COUNT
Baseball,1
Volleyball,2
Softball,1

4人目で最後ですが、出だしは名前を聞くので3人目までと同じです。

次のおすすめのスポーツは、ranking.csvからデータを取得して、一番数の多い順に紹介します。

Yesの回答が得られたときか、記録されているすべてのスポーツを聞いてしまった場合に、大好きなスポーツを尋ねる質問に移動します。

答えたスポーツがranking.csvになければ、NAMEにスポーツ名、COUNTに1を追加します。

一気に全ては無理

1人目から4人目までのやり取りを、一気にプログラミングすることはできなくもありませんが、それは、一流のPythonマスターだったらできるということです。

初心者にとっては、この一連の流れを考えながら、一気にコードを書くことは無理です。

答えがないので、いろいろな方法で、この対話を実現することは可能です。
なので、これまで学習してきたことを思い出しながら、積み木のように組み立てていきましょう!

少し長くなったので、今回は課題の提供で終了したいと思いますが、
私自身、この課題への答えを何通りか試しているところです。

明日はまず、一人目の対話ファイルを完成させる予定です。

それでは明日も、Good Python!