Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

「returnの代わりにprint()を書くと判定がFalseになります」クラス内のメソッドでreturnが必要な理由を解説します。

f:id:kenken0326:20201110122258p:plain

こんにちは。PyQサポートです。
今回は、「クラス内のメソッドでreturnが必要な理由」を解説します。

質問

クラスを使ってアドレス帳を作ろうとしています。姓、名のデータをつなげてフルネームを表示したり検索したりさせたいです。
そこでフルネームを作るメソッドを以下のように実装したのですが、クラスのメソッド内でprint()を使うと、メソッドの外でフルネームを使いたい時に値がNoneになってしまいます。returnを使うと期待通り動くのですが、どうしてprint()だけではいけないのか解りません。returnが必要な理由を教えてください。

書いたコード

class Person:
    def __init__(self, last_name, first_name, tel, mail_address):
        self.last_name = last_name  # 姓
        self.first_name = first_name  # 名前
        self.tel = tel  # 電話番号
        self.mail_address = mail_address  # メアド

    def full_name(self):
        """フルネーム(姓+空白1文字+名前)を返す"""
        print(self.last_name + ' ' + self.first_name)
        # return self.last_name + ' ' + self.first_name
        
person1 = Person('田中', '一郎', '03-1111-2222', 'ichiro@pyq.jp')
print(person1.full_name() == '田中 一郎')

person2 = Person('山田', '花子', '03-1111-3333', 'hanako@pyq.jp')
print(person2.full_name() == '山田 花子')

実行結果

田中 一郎
False
山田 花子
False

正しいコード

class Person:
    def __init__(self, last_name, first_name, tel, mail_address):
        self.last_name = last_name  # 姓
        self.first_name = first_name  # 名前
        self.tel = tel  # 電話番号
        self.mail_address = mail_address  # メアド

    def full_name(self):
        """フルネーム(姓+空白1文字+名前)を返す"""
        return self.last_name + ' ' + self.first_name

person1 = Person('田中', '一郎', '03-1111-2222', 'ichiro@pyq.jp')
print(person1.full_name() == '田中 一郎')

person2 = Person('山田', '花子', '03-1111-3333', 'hanako@pyq.jp')
print(person2.full_name() == '山田 花子')

実行結果

True
True

回答

returnしないと full_nameメソッドは戻り値を何も返しません。
代わりに、「値がないこと」を表す None を返します。

print()はあくまで画面上に表示するだけです。
メソッドの外で "田中 一郎"という文字列を扱いたい場合は、 returnを使ってself.last_name + ' ' + self.first_nameの処理結果を返す必要があります。

returnprint()person1.full_name()からの戻り値を確認してみると良いかと思います。

それぞれ以下のような挙動になるはずです。

print()の場合

name = person1.full_name() # このタイミングで"田中 一郎"が画面上に表示される
print(name) # メソッドfull_name()にreturnがないので、変数nameにはNoneが代入されます。変数nameをprintしてもNoneと表示される

return の場合

name = person1.full_name() # 特に何も表示されない。戻り値が変数nameに格納される
print(name) # 変数nameをprint()すると"田中 一郎" と表示される。変数nameの中に文字列データがあることが確認できる
Copyright ©2017- BeProud Inc. All rights reserved.