0〜100の範囲に対して入力をテストする単純なフィルターを使用します。
def foo(foo_input):
if 0 <= foo_input <= 100:
return f_input
の場合、これはnoneを返しますfoo_input is > 100
。しかし、それは実際には何も返さないのでしょうか?または、関数は常に何かを返す必要がありますか?
関数は常に何かを返します(少なくともNone
、実行中にreturnステートメントに到達せず、関数の終わりに到達した場合)。
もう1つのケースは、例外によって中断された場合です。この場合、例外処理は「スタックを支配」し、適切なエラーに戻るexcept
か、厄介なエラーが発生します:)
あなたの問題に関して、私は2つの可能性があると言わなければなりません:あなたは何かを返すか、持っていないかのどちらかです。
None
場合は、これが当てはまることを呼び出し元に通知します(呼び出し元に、「何も」が返されないことを通知するより良い方法はありませんNone
。だからそれをチェックしてください、そしてあなたは大丈夫でしょう)いいえ。return
関数が終了する前にステートメントに到達しない場合は、暗黙的None
に返されます。
returnステートメントに到達しない場合、関数はを返しますNone
。
def set_x():
x = 2
あなたが本当に何をしようとしているのかわかりません。ここにあなたが好きかもしれないいくつかのものがあります:
def foo(foo_input, foo_default):
if 0 <= foo_input <= 100:
return f_input
else:
return foo_default
def foo(foo_input):
if 0 <= foo_input <= 100:
return f_input
raise ValueError, "foo_input was not in range [0, 100]"
待って、あなたは「フィルター」と言いました。一連の値をフィルタリングしていて、基準を満たす値を抽出したいだけですか?Pythonでは簡単です。
def foo_check(x):
return 0 <= x <= 100
filtered_list = [x for x in unfiltered_sequence if foo_check(x)]
そして、あなたは「機能の連鎖」と言いました。シーケンスのフィルタリングについて話している場合も、これは簡単です。
def foo_filter(seq):
for x in seq:
if 0 <= x <= 100:
yield x
def other_filter(seq):
for x in seq:
if meets_criterion(x):
yield x
def do_the_task(seq):
for x in other_filter(foo_filter(seq)):
do_something(x)
編集:これはPythonのイテレーターとジェネレーターの素晴らしい紹介です。 http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/
私は暗黙のようなものですreturn None
が、pylintはそれを悪いスタイルとしてフラグを立てます、警告:
関数内のすべてのreturnステートメントが式を返すか、いずれも返さない必要があります。pylint(inconsistent-return-statements)
したがって、
def foo(foo_input):
if 0 <= foo_input <= 100:
return f_input
return None
機能的に同じであっても、より良いスタイルかもしれません。
Pylintの変更ログに記載されている詳細情報はこちらから入手できます。
inconsistent-return-statementsについて警告するために、新しいPythonチェッカーが追加されました。関数またはメソッドが明示的な値と暗黙的な値の両方を返す場合、一貫性のないreturnステートメントがあります...
PEP8によると、returnステートメントが式を返す場合、値が返されないreturnステートメントは、これをreturn Noneとして明示的に記述し、関数の最後に明示的なreturnステートメントが存在する必要があります(到達可能な場合)。