2

関数の別の入力であるデフォルト値を持つ関数を書きたいと思います。私はこのようなものが欲しいです:

def pythag_thm(a, b=a):
    return (a**2 + b**2)**.5

しかし、私はNameError: name 'a' is not defined. 私は次のようなことができることに気づきました:

def pythag_thm(a, b=False):
     if b==False:
         return (a**2 + a**2)**.5
     else:
         return (a**2 + b**2)**.5

しかし、これは非常に「pythonic」ではないようです。これを行うためのきれいな方法はありますか?私はこれを間違った方法で考えているだけですか?

4

5 に答える 5

3

人々が通常行うことは、

def pythag_thm(a, b=None):
    if b is None:
        b = a

    return (a ** 2 + b ** 2) ** .5
于 2013-02-14T22:13:44.003 に答える
2

デフォルト引数は関数定義時に評価されるため、そのようにする方法はありません。

import math
def pythag_thm(a, b=None):
    if b is None:
        b = a
    return math.hypot(a, b)
于 2013-02-14T22:13:50.623 に答える
1
  1. 人々は通常これを使用Noneします:

    def pythag_thm(a, b=None):
        b = b if b is not None else a
        ...
    
  2. Noneが有効な値である場合は、b独自のDEFAULT値を作成できます。

    DEFAULT = object()
    
    def pythag_thm(a, b=DEFAULT):
        b = b if b is not DEFAULT else a
        ...
    
  3. 気分がよければ*args**kwargs自分で処理することもできます。

    def pythag_thm(a, *args, **kwargs):
        try
            b = args[0]
            assert len(args) == 1
        except IndexError:
            try:
                b = kwargs.pop('b')
                assert not kwargs
            except KeyError:
                b = a
        ...
    

argsおそらく、バリアント 1 または 2 に固執することをお勧めします。これは、最も Pythonic であり、 andをいじる必要がないためですkwargs

于 2013-02-14T22:20:58.677 に答える
0

b が a が何であるかを知るための入力の範囲はありません。それらは関数の本体に入るまで存在しません

私が考えることができる最もpythonicな方法は次のとおりです。

def example(a, b=None):
    if not b: b = a
    // code here

編集:@pavelの答えと同じです-より速いタイピングを学ぶ必要があります。ラーカーの場合: 動作に違いがあります。Pavelの答えはより良いです、私のものは次のようなものを正しく処理しません:

example (2, 0)

b is None テストの方が正しいため

于 2013-02-14T22:14:40.953 に答える
0

デフォルト値をリストにしたい場合の例として、デフォルト値を提供するときは特に注意する必要があります。ここに間違いがあります。

>>> def function_with_default(arg=[]):
...    return arg
... 

予期しない結果になる例を次に示します。

>>> ret = function_with_default()
>>> ret
[]
>>> ret.append(2)
>>> # unexpected side-effects ...
>>> ret2 = function_with_default()
>>> ret2
[2]

上記の例では、実際にオブジェクトを変更できます。副作用なしでそれを行う方法は次のとおりです。

>>> def function_with_default(arg=None):
...    if arg is None:
...       arg = []
...    return arg
... 

同じ例、異なる出力:

>>> ret = function_with_default()
>>> ret
[]
>>> ret.append(2)
>>> # no unexpected side-effects this time ...
>>> ret2 = function_with_default()
>>> ret2
[]

あなたの質問に答えるために、あなたは使用できます。

def pythag_thm(a, b=None):
   if b is None:
      b = a
   return (a**2 + b**2)**.5
于 2013-02-14T22:41:51.753 に答える