2017-07-14 1 views
0

私は関数を持っています。 if文の中に定義を囲むべきですか?ifを定義の中に入れるべきでしょうか?Pythonはブロック内で関数を定義するか、またはその逆の場合に関数を定義する

# Case 1 
if mode == 1: 
    def f(x): 
     return x + 5 
else: 
    def f(x): 
     return x - 5 

# Case 2 
def f(x): 
    if mode == 1: 
     return x + 5 
    else: 
     return x - 5 

私は過去の両方を行っていると私の静的コード分析ツールは、文句を言うしていないようです。だから私はPythonの推奨があるかどうか疑問に思っていましたか?

EDIT:これまでのコメントから、両方のケースが受け入れられるようです。ユースケースによって異なります。モードが一定であることが意図されている場合、ケース1が好ましい。そうでなければ、ケース2

EDIT2:この質問は実際に私が関数を書いていたときに起こった。入力としてモードを取り込み、モードに応じて、それらの操作に関数内でのみ定義された別のサブ関数を使用する点を除き、同様の操作を実行します。関数の実行中にサブ関数が一定のままであるため、ケース1がより適切であるように見えます。

EDIT3:訂正:過去には、私は、これらの日、それはケース1と快適ではなかったことPyLintだと信じていた私はPyCharmを使用し、そのフラグにケース1

+3

は、ケース1では、あなたが唯一の条件を一度確認してください。 – vaultah

+0

2番目はより汎用性が高いようです。たとえば、ある時点でモードが変わるとどうなりますか?ケース2はここでも動作しますが、ケース1は動作しません。 – arshajii

+3

この機能をどのように使いたいですか?あなたの2つの例は異なる動作をします。ケース1では、決定を一度行い、得られる関数は修正されます。ケース2では、関数を呼び出すたびに新しい意思決定を行います。 – BrenBarn

答えて

0

のDependsに問題がいないようですあなたがそれを使用したいものについて。どちらも便利な方法で使用できます。あなたがコードしながら、モードを切り替えるにしたいときに、これらの例の最初のがベストです

2.

Mode = 1 
    Number = 0 
    if Mode == 1: 
     def f(x): 
      return x + 5 
    else: 
     def f(x): 
      return x - 5 
    for i in range(0,5): 
     number += f(i) 

:対

1.

Mode = 1 
    Number = 0 
    def f(x): 
     global Mode 
     if Mode == 1: 
      Mode = 0 
      return x + 5 
     else: 
      Mode = 1 
      return x - 5 

    for i in range(0,5): 
     Number += f(i) 

:2つの例を比較が走っています。 2つ目の方法は、どちらか一方だけが必要な場合に最適です。最初の関数は、実行中にモードが変更されるため、常に答えを返します。しかし、2番目の関数は、最初にモードを設定する内容に応じて35または-15の出力を与えます。

0

あなたの関数の動作は、外部の値に依存してはならないので、私は最初の例を使用することをお勧めします:

# Case 1 
if mode == 1: 
    def f(x): 
     return x + 5 
else: 
    def f(x): 
     return x - 5 
関連する問題