Python Jarvis

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

たまに、無性に餃子を食べてくなる時があります。

そんなときは、【大阪王将】にするか【餃子の王将】にするか迷うんですよね。

でもまー、大抵は【大阪王将】にするのですが、その割合は、4対1といった感じでしょうか。

決め手はやっぱり、味噌ダレがあるかどうかというところです。

最近、味噌ダレはテーブルに置いてなくて、頼まないと持ってきてくれないのですが、【大阪王将】で餃子を食べるなら、味噌ダレがおすすめですので、ぜひ一度試してみてください。

それでは今日もPython学習をはじめていきましょう。

昨日の復習

昨日は、簡単なアプリケーションである対話型ロボットのコードが完成しました。

とはいえ、withステートメントでファイルを開くコードの中にwithステートメントで同じファイルを開いているなど、ちょっと気になるところもありました。

いろいろな入力を試してみてもうまく動いているので、問題はないのかもしれませんが、もっとシンプルなコードにできる余地はあったかと思います。

完成したコードは、昨日の記事をごらんください。

それでは、本日もPython学習をすすめていきます。

対話ロボットJarvis

昨日までは、Jarvisという名前は使っていたものの、質問をプリント出力して、条件分岐をさせた処理をしていました。

今回は、対話ロボットJarvisというクラスを作って、オブジェクト化したものに、処理をさせるコードを考えてみたいと思います。

Jarvisクラスの作成

一人目の質問だけをカバーすればいいので、前回作成した1人目のコードと同様に、csvライブラリを読み込み、1つ目の質問、2つ目の質問、最後の質問を関数にして実行できるクラスを作成します。

基本となる形はこのようになります。

import csv

class Jarvis(object):
    def say_hello(self):
        # 1つ目の質問と取得した名前をキャピタライズする
        
    def ask_main(self):
        # 2つ目の質問と取得したスポーツ名をキャピタライズする

    def __del__(self):
        # 最後のお礼とCSVの作成       

if __name__ == '__main__':
    jarvis = Jarvis()
    jarvis.say_hellow()
    jarvis.ask_main()
    del jarvis

最初の質問は最初に処理するので、初期化の__init__(self)の中に入れようと思いました。

そこで最初の関数def say_hello(self)def __init__(self)にして、次のようにしてみました。

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

でもどうやってもエラーが起こってうまくいかないんですよね。

どうやら、初期化の際にinput()で値を取得することはできないみたいなので、def say_hello(self)で1回目の質問を実行することにします。

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

2つ目の質問

2つ目の質問は、好きなスポーツを尋ねる質問です。

メインの質問になるため、def ask_main(self)という関数にしました。

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

input()関数で質問をしてスポーツ名を取得するコードは、前回のコードと一緒です

最後のお礼とCSVの作成

最後は、お礼の挨拶の出力とCSVの作成です。

def __del__(self):
    print('\n{}さん、回答ありとうございました。\n良い1日をお過ごし下さい!'.format(self.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': self.c_like_sports, 'COUNT': 1})

こちらのコードも前回同様のコードになりますが、違うのは、デストラクタにしているところです。

クラスのオブジェクトが削除されるときに、この処理をするわけですが、初期化の時とは違い、input()関数で値を取得するわけではないので、挨拶の出力とranking.csvの書き込み処理をさせています。

完成コード

クラスJarvisでのコードは最後にオブジェクト(インスタンス)を作成して、関数を実行する必要があります。

実行の際は、if __name__ == '__main__':を記述したあとに、オブジェクトの生成と関数の実行コードを記述しますが、これはこのパッケージが他のモジュールから読み込まれたときに即実行されないようにするためでした。

#簡単なアプリケーション対話ロボット1
import csv

class Jarvis(object):
    def say_hello(self):
        name = input('こんにちは。わたしはジャービスです。あなたの名前を教えてください。\n')
        self.c_name = name.title()
        return self.c_name
        
    def ask_main(self):
        like_sports = input('\n{}さん、あなたの好きなスポーツは何ですか?\n英語で答えてください\n'.format(self.c_name))
        self.c_like_sports = like_sports.title()
        return self.c_like_sports

    def __del__(self):
        print('\n{}さん、回答ありとうございました。\n良い1日をお過ごし下さい!'.format(self.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': self.c_like_sports, 'COUNT': 1})        


if __name__ == '__main__':
    jarvis = Jarvis()
    jarvis.say_hello()
    jarvis.ask_main()
    del jarvis

25行目でJarvisインスタンスを作成し、その後、1つ目の質問、2つ目の質問、最後の挨拶を実行しています。

オブジェクト指向

オブジェクト思考というのがいまいちイメージできていなかったのですが、今回のコードと前回のコードの違いを考えつつ、なんとなくオブジェクト指向という考え方が少しわかったような気がします。

もしかしたら、Robotというクラスを作って、Jarvisという名前をもたせたほうがいいのかもしれませんが、まずはこの形で2人目以降の質問に対応するコードを作っていこうと思います。

それでは、明日もGood Python!