31

0〜100の範囲に対して入力をテストする単純なフィルターを使用します。

def foo(foo_input):
    if 0 <= foo_input <= 100:
        return f_input

の場合、これはnoneを返しますfoo_input is > 100。しかし、それは実際には何も返さないのでしょうか?または、関数は常に何かを返す必要がありますか?

4

5 に答える 5

38

関数は常に何かを返します(少なくともNone、実行中にreturnステートメントに到達せず、関数の終わりに到達した場合)。

もう1つのケースは、例外によって中断された場合です。この場合、例外処理は「スタックを支配」し、適切なエラーに戻るexceptか、厄介なエラーが発生します:)

あなたの問題に関して、私は2つの可能性があると言わなければなりません:あなたは何かを返すか、持っていないかのどちらかです。

  • 返品するものがある場合は返品してください。返品しない場合は返品しないでください。
  • 特定のタイプの返されるものに依存しているが、このタイプの意味のあるものを返すことができないNone場合は、これが当てはまることを呼び出し元に通知します(呼び出し元に、「何も」が返されないことを通知するより良い方法はありませんNone。だからそれをチェックしてください、そしてあなたは大丈夫でしょう)
于 2012-04-08T22:18:52.333 に答える
27

いいえ。return関数が終了する前にステートメントに到達しない場合は、暗黙的Noneに返されます。

于 2012-04-08T22:19:07.003 に答える
10

returnステートメントに到達しない場合、関数はを返しますNone

def set_x():
    x = 2
于 2012-04-08T22:21:25.770 に答える
4

あなたが本当に何をしようとしているのかわかりません。ここにあなたが好きかもしれないいくつかのものがあります:

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/

于 2012-04-08T22:33:49.727 に答える
1

私は暗黙のようなものです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ステートメントが存在する必要があります(到達可能な場合)。

于 2019-04-10T22:33:29.430 に答える