26

Python には MATLAB の nargout に相当するものがありますか? 戻りパラメータの数を柔軟に保ちたい場合、nargout は非常に巧妙なアプローチだと思います。要求された出力パラメーターの数を確認する方法はありますか? 次の疑似 python コードのようなもの:

def var_returns_func(a):
  """
  a is a 1D numpy array
  """
  if nargout==1: return a.sum()
  elif nargout==2: return a.sum(),a.std()

したがって、この関数を として呼び出すとmean = var_returns_func(someNumPyarray)、単一の値が返されます。しかし、それを として呼び出すとmean,std = var_returns_func(someNumPyarray)、2 つの値が返されます。

これを行うPythonicの方法はありますか? それともハッキーな方法ですか?

4

5 に答える 5

18

関数は、戻り値で何が行われるかを知ることができないため、必要な数を知ることができません。できることはnargout、関数に引数として渡し、それを使用して何を返すかを決定することです。

def f(a, nargout=1):
    if nargout == 1:
        return "one value"
    elif nargout == 2:
        return "two", "values"
    else:
        raise ValueError, "Invalid nargout!"

これは、Python 哲学としての「明示的は暗黙的よりも優れている」の例です。2 つの引数を出力する場合は、2 つの引数を出力することを明示的に指定する必要があります。Python では、結果に対して何が行われるかを確認するために将来を見据えて暗黙的に決定することは推奨されていません。a で 2 要素タプルを取得すること完全に可能a = f(x)です。

あなたのような例については、より良い方法がたくさんあります。1 つはただ行うことmean, std = a.mean(), a.std()、またはより一般的に行うことx, y = someFunc(a), otherFunc(a)です。この特定の値の組み合わせが一般的に必要であり、複製したくない両方の操作で共有される高価な計算がある場合は、両方を明確に返す 3 番目の関数と do を作成しますx, y = funcThatReturnsTwoThings(a)。これらはすべて、関数が異なることを行う場合に関数を分離しておく明示的な方法です。

于 2013-01-03T21:42:04.010 に答える
11

MATLAB を知らないので、MATLABについて話すことはnargoutできません。正しく使用する方法を想像することもできません。ただし、ビューを Python 関数 (またはメソッド) が実際に実行する内容に変更したい場合があります)。

実際、Python は常に正確に 1 つの値を返します。または、None であるか、特定の型の単一の値であるか、そのtuple型の単一のオブジェクトです。

returnコマンドがないNone場合、関数本体が終了すると関数は戻ります。returnbody の最後、または body の最後に引数なしで明示的に記述した場合と同じですreturn None

を使用した場合return None( はNone変数に格納できます)、またはreturn引数なしで、Noneは呼び出し元に返されます。

の場合return singlesingleオブジェクトは呼び出し元に返されます。

の場合return v1, v2, v3、実際にはタプルを返します(v1, v2, v3)。かっこを書く必要がないのは、単なる構文糖衣です。

このresult1, result2, result3 = f()場合の は、もう 1 つのシンタックス シュガーです。はタプルを返し、そのf()要素は指定された変数に自動的に抽出されます。あなたは実際に行います:

result1, result2, result3 = (v1, v2, v3)

また

t = f()                           # where t is the (v1, v2, v3)
result1, result2, result3 = t

実際、Python では、他の言語でよくあるように出力引数を定義することはできません。引数オブジェクトのアドレスを渡すという観点から考えることができ、渡されたオブジェクトが変更できる場合は、それを変更できます。Noneただし、たとえば、最初に値があった渡された引数に新しい結果を取得することはできません。関数の出力引数を介して Python 変数を割り当てることはできません。Python にはそのようなメカニズムはありません。

関数内から新しく作成された値 (オブジェクト) を返す唯一の自然で直接的な方法は、returnコマンドを使用することです。ただし、Python 関数は、返される引数の数を制限しません。(まあ、それがタプルだった場合、後で要素に分割できる常に単一のものです。)

呼び出し元のコードで実際に返されたものをテストしたい場合は、次の値が返された場合に特別なことを行う独自の関数を作成Noneできますsingle:len(t)返されたタプルでt)。single関数は、各タプル要素のタイプまたはタイプをテストし、それに応じて機能することもできます。

于 2013-01-03T22:20:43.460 に答える
3

Matlab では、出力引数の数は実際には関数への入力の 1 つです。これは Python には当てはまらないため、これを別の方法で反映するように関数のインターフェイスを設定しました。

たとえば、これは upper() を文字列のグループに適用する関数であり、ユーザーは入力の数が出力の数と等しいと期待できます。構文も Matlab のものと非常によく似ています。

>>> def var_returns_f(*args):
...     return [str.upper() for str in args]
... 
>>> 
>>> a, b = var_returns_f('one', 'two')
>>> 
>>> a
'ONE'
>>> b
'TWO'
于 2015-06-22T09:45:59.227 に答える