[解決済み] return, return None, and no return at all?
質問
3つの関数を考えてみましょう。
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
これらはすべてNoneを返すように見えます。これらの関数の戻り値の動作に違いはあるのでしょうか? また、どちらかを選ぶべき理由はありますか?
どのように解決するのですか?
実際の動作では、違いはありません。いずれも
None
で終わりです。しかし、これらにはすべて時と場合があります。
以下の説明は、基本的にそれぞれのメソッドをどのように使うべきか(少なくとも私が教わった方法)ですが、絶対的なルールではないので、必要だと感じたらそれらを混ぜて使うことも可能です。
使用方法
return None
これは、この関数が後で使用するための値を返すことを意図していることを表しています。
None
. この値
None
は、他の場所で使用することができます。
return None
は、関数の戻り値が他にない場合は、決して使用されません。
次の例では
person
's
mother
もし
person
は人間である。もし人間でない場合は
None
というのは
person
を持たないので
mother
(仮に動物などではないとします)。
def get_mother(person):
if is_human(person):
return person.mother
else:
return None
使用方法
return
と同じ理由で使用されます。
break
をループで使用します。戻り値は重要ではなく、関数全体を終了させたいだけなのです。それほど頻繁に必要としないにもかかわらず、場所によっては非常に便利です。
私たちは、15
prisoners
その中の一人がナイフを持っていることが分かっています。それぞれの
prisoner
を1つずつチェックし、ナイフを持っているかどうかを確認します。もしナイフを持った人に当たったら、ナイフは一本だけなので、この関数を終了すればいいのです。
prisoners
. が見つからなかったら
prisoner
をナイフで刺すと、アラートが発生します。これは様々な方法で行うことができますし
return
はベストな方法ではないかもしれませんが、あくまで例として
return
関数の終了に使用します。
def find_prisoner_with_knife(prisoners):
for prisoner in prisoners:
if "knife" in prisoner.items:
prisoner.move_to_inquisition()
return # no need to check rest of the prisoners nor raise an alert
raise_alert()
注:決して
var = find_prisoner_with_knife()
というのも、その返り値はキャッチされることを意図していないからです。
を使用しない
return
を使用します。
また、これは
None
しかし、この値は使用したり、捕捉したりするためのものではありません。単に関数が正常に終了したことを意味します。これは基本的に
return
で
void
C++やJavaなどの言語における関数です。
次の例では、人の母親の名前を設定し、関数が正常に終了した後に終了しています。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注:決して
var = set_mother(my_person, my_mother)
というのも、その返り値はキャッチされることを意図していないからです。
関連
-
python implement mysql add delete check change サンプルコード
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] NULLと'ⅳ0'と'0'の違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】Python2のdict.items()とdict.iteritems()の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】Flaskのテンプレートが見つからない【重複あり