2016-08-01 3 views
0

オプションの出力パラメータで関数を書く方法を教えてください。例で オプションの出力パラメータを持つ関数をPythonで書く方法はありますか?

1)mat = ReadBinFile(filename) 又は
2)[mat,titles] = ReadBinFile(filename)

iは

return mat,titles 

と "ReadBinFile" 機能を終えた場合、私は最初の例では "マット" のタプルを有する

ありがとうございました

+0

これはどのようなケースですか? 2番目のタプル要素を必要としない場合は、それを無視してください。 – mhawke

+0

これはできません。それはとにかく素晴らしいアイデアではありません。結果をアンパックして、不要な要素を破棄してください。 – BrenBarn

+0

タプル上のジェネレータを使用すると、潜在的に時間を短縮できるというメリットがあります(各要素に時間がかかる場合) –

答えて

-1

これを行うには2通りの方法があります。 1つは、戻り値を決定する引数を受け入れることです。 2番目の方法は、ジェネレータを返すことです。

def ReadBinFile(filename): 
    yield mat 
    yield titles 

mat,titles = ReadBinFile(filename) 

これにより、最初のn個の戻り値が得られます。

+1

これは実際には機能しません。 'mat = ReadBinFile(filename)'を実行すると、 'mat'は最初に生成された値ではなく、ジェネレータ自体を取得します。 – BrenBarn

+0

私はあなたがしたいことを正確に行う方法はないと思います。 Pythonでは、構文を変更することはできませんが、機能的な結果を得ることができます。私はこれがあなたが探しているすべての機能を提供していると確信しています。 –

0

戻り値の型が必要な関数を指定したり、関数名をマスクしたりすることはできません(私のコメントを参照してください)。

理由を説明しましょう。

私たちはこれを行うには、コンテキストをテストします。最初の(単一の戻り値)はスカラーコンテキストであり、2番目はリストコンテキストです。 wantarray(Google "python wantarray" - 他の検索エンジンも利用可能)という関数を使ってテストできました。 Perlは、この理由と他の多くのために、ユニークでない場合は珍しいです。

他の言語と比較してイントロスペクションを極端に行うことはできますが、Pythonはそれほど機能しません。割り当ての形式は次のとおりです。

name = object 

nameはタイプレスリファレンスです。だから、:いくつかの卑劣な手段によって、私たちはバイトコードを検査しても、場合

mat = ReadBinFile(filename) 

、我々は参照するようになっているオブジェクトmatのどのクラスを知る方法はありません。 A list,tuple,int,bird,plane

構文あなたは示しています。

[mat,titles] = ReadBinFile(filename) 

はパズルです。有効ではあるが、実際の違いはありません。

mat,titles = ReadBinFile(filename) 

もちろんタプルです。

mat = ReadBinFile(filename) 

tuplelist、またはオブジェクトmatのどんなクラスが参照するようになっている必要があります:あれば、どのように伝えることができます。

結局のところ、私の意見では、別のクラスのオブジェクトを返すことは、Perlでさえ疑わしい練習です。たとえば、いくつかの状況でNoneを返す例外がいくつかあります。なぜ疑わしい?このコードは、読み込み、変更、およびサポートが難しくなります。

関連する問題