Python 対話型アプリケーション 実践

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

突然ですが、特別定額給付金の申請は済みましたか?

マイナンバーカードとiPhone(7以上)があれば、スマホから特別定額給付金の申請をすることができるのでおすすめですが、世帯主しか申請できなかったり、マイナンバーカードが必要だったり、マイナンバー暗証番号だけでなく署名用電子証明書番号も必要だったり、デジタル機器にかなり強い人でないと、ハードルが高いような気がします。

私は新しいもの好きだったため、かなり前からマイナンバーカードを取得していたので、確定申告で使ったり、住民票をコンビニで取得したりと意外と便利に使っていました。

なので、今回の特別定額給付金についても、マイナポータルから申請を完了しました。

マイナンバーカードを取得するには1ヶ月ほどかかるらしいので、今、マイナンバーカードを持っていない人は郵送式申請が一番だと思いますが、マイナンバーカードとiPhoneを使っている人は、オンライン申請が便利なのでぜひ試してみてください。

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

昨日の復習

昨日は、これから数日かけて作成する対話型アプリの構造を説明しました。

対話ロボットの質問に答えて、データをCSVに保存して、保存したデータをもとに質問を変えたり、すでにある値の場合は数値をカウントしたりして、どんどんデータが蓄積していくアプリケーションです。

保存されたデータに応じた対応をさせるのは少しむずかしいので、まずは1人目に質問するだけのコードを書いてみようと思います。

全体像は、昨日の記事をごらんください。

それでは、一人目の質問に答えるコードを書いていきましょう!

ロボットはJarvis

質問をするロボットは【Jarvis】にしましたが、アイアンマンから名前をいただきました。

ちなみに、2016年に、FacebookのCEOであるマーク・ザッカーバーグ氏が、モーガン・フリーマンに音声を担当してもらい、AI執事【Jarvis】を作ったという画期的なニュースがありましたが、はたしていま、そのJarvisはどうなってるんでしょうか?

このJarvisには遠く及びませんが、まずは1人目に対応するJarvisのコードを書いていきます。

質問1

JarvisJarvis

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

最初の質問ですが、print()を使う方法と、input()に引数を入れる方法があります。

print('こんにちは。わたしはジャービスです。あなたの名前を教えてください。\n')
name = input()
c_name = name.title()
name = input('こんにちは。わたしはジャービスです。あなたの名前を教えてください。\n')
c_name = name.capitalize()

コードが短くなるということでは、input()に引数を入れたほうがいいのかなと思います。

次にどちらでもいいのですが、titleもしくはcapitalizeで、input()で取得した値の先頭の文字を大文字にします。

capitalizeは、英語の文章の先頭の文字だけを大文字にして、titleは、先頭の文字だけでなく、スペースの次に続く単語の一文字を大文字にします。

質問2

JarvisJarvis

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

続いての質問は、最初に取得したデータがキャピタライズされたc_nameを使って質問をします。

print('\n{}さん、あなたの好きなスポーツは何ですか?\n英語で答えてください\n'.format(c_name))
like_sports = input()
c_like_sports = like_sports.title()
input('\n{}さん、あなたの好きなスポーツは何ですか?\n英語で答えてください\n'.format(c_name))
c_like_sports = like_sports.title()

この質問では、最初の頃に学習した.format()を活用して、最初に取得した値をキャピタライズした値を代入して質問をしています。

print()を使うより、input()にそのまま引数にしたほうがシンプルになりますね。

最後のtitle()は、capitalizeでもいいのですが、スペースでつなげるものがあったときのためにtitle()のほうが良いでしょう。

ちなみに、こちらの質問は日本語だと、ひらがな、カタカナ、漢字の3種類があり、それらを同じものとして扱うのは、ちょっと手間になるので、英語で答えてもらうようにしています。

最後のお礼

JarvisJarvis

Masteruさん、回答ありとうございました。
良い1日をお過ごし下さい!

最後にお礼の挨拶を出力します。

print('\n{}さん、回答ありとうございました。\n良い1日をお過ごし下さい!'.format(c_name))

こちらにも最初に取得した値をキャピタライズしたc_nameを活用してお礼の出力をします。

CSVを作る

最後の処理は、CSVを作って取得したデータを書き込む処理です。

上の2つの質問コードと合わせたコードを書いてみます。

import csv

name = input('こんにちは。わたしはジャービスです。あなたの名前を教えてください。\n')
c_name = name.capitalize()

like_sports = input('\n{}さん、あなたの好きなスポーツは何ですか?\n英語で答えてください'.format(c_name))
c_like_sports = like_sports.title()

print('\n{}さん、回答ありとうございました。\n良い1日をお過ごし下さい!'.format(c_name))

with open('ranking.csv', 'w') as rank_csv:
    fieldnames = ('NAME', 'COUNT')
    writer = csv.DictWriter(rank_csv, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'NAME': c_like_sports, 'COUNT': 1})

csvライブラリを読み込んで、with open()でCSVファイルを書き込みモードで作成します。

ちなみに、好きなスポーツを日本語でも取得する場合は、open()の第3引数に encoding='UTF-8'を入れないとエラーになってしまいましたが、今回は、英語で値を取得するので省いています。

fieldnamesに、NAMECOUNTを指定して、ヘッダーを書き込んだあと、新しい行のNAMEフィールドに、取得したスポーツ名をtitle()で加工したc_like_sportsCOUNT1を書き込んで終了です。

コードを実行して、問題なく作動すれば、同じ階層にranking.csvが作成され、その中身は次のようになっているはずです。

NAME,COUNT
Soccer,1

1人限定のコード

今回書いたコードは、1人しか質問しない場合限定のコードです。

本来は、CSVファイルが存在する場合や存在しない場合、CSVの中身によって質問を変えたりしないといけませんが、まずはシンプルに質問に答えてデータを保存するという形にしています。

2人目の人や3人目の人に質問するときも、ずっと同じ質問を繰り返して、書き込むCSVもずっと1行だけ上書きし続けます。

とはいえ、このコードがないと、2人目にすすめないので、1人目の質問に答えて、CSVファイルを作成して、取得したデータをCSVに書き込むという単純なコードを書いてみました。

今日のコードは非常にシンプルで簡単でしたが、明日からは、条件分岐も使いながら、少しだけ複雑なコードになるかと思います。

設計図的なものを書いたほうが条件分岐もわかりやすくなるので、明日以降は分岐図を書いていこうと思います。

それでは明日も、Good Python!