0

これは、メソッドのオーバーロードに似ています。print Hello(1, 2, 3)実行されると戻りますが、戻りたい"a and b"です"a and b and c"。私はif (a and b and c is None)それがうまくいっただろうと私が言うことができたことを知っています。しかし、20個のパラメーターがあり、すべてのケースを処理するif必要がある場合、必要ではないと思う複数のステートメントになります。このような問題を解決するためのより良い方法はありますか?

 def Hello(a=None, b=None, c=None):
    if(a and b):
        return "a and b"
    if(a and c):
       return "a and c"
    if(a and b and c):
       return "a and b and c"

print Hello(1, 2, 3)
4

3 に答える 3

4

ifステートメントを並べ替える必要があります。

 def Hello(a=None, b=None, c=None):
    if a and b and c:
       return "a and b and c"
    if a and b:
        return "a and b"
    if a and c:
       return "a and c"

が trueにa and b and c評価されると、a and bも true に評価されるため、コードでは、このケースは最初の によって処理されますif

于 2013-01-12T21:43:01.000 に答える
3

プログラムのロジックを再考する必要があります。通常、API には、すべての入力から大きなデシジョン ツリーを構築する必要があるすべてのオプション パラメータはありません

つまり、実際のプログラムでは、入力の組み合わせごとに動作がまったく異なる関数に遭遇することは通常ありません。例外なく、多数のオプション パラメータの場合でも、有効な組み合わせははるかに小さくなります。

おもちゃの例では、決定木を含まない戻り値を作成する他の方法を考え出すことができます。

  • マップの応答:

    responsemap = {
        (True,  True,  False): "a and b",
        (True,  False, True):  "a and c",
        (True,  True,  True):  "a and b and c"
    }
    
    def Hello(a=None, b=None, c=None):
        return responsemap.get((bool(a), bool(b), bool(c)), None)
    
  • 入力に基づいて文字列を作成します。

    def Hello(a=None, b=None, c=None):
        return ' and '.join([n for n in ('a', 'b', 'c') if locals()[n]])
    
于 2013-01-12T22:00:23.107 に答える