2009-03-27 5 views
12

したがって、Python関数は複数の値を返すことができます。以下のことが可能であれば便利だと思いました。Pythonの引数として複数の戻り値を持つ関数を渡す

a = [[1,2],[3,4]] 

def cord(): 
    return 1, 1 

def printa(y,x): 
    print a[y][x] 

printa(cord()) 

...ですが、そうではありません。私は、両方の戻り値を一時変数にダンプすることで同じことをすることができることに気付いていますが、それは優雅ではありません。最後の行を "printa(code()[0]、cord()[1])"として書き直すこともできますが、これはcord()を2回実行します。

これを行うためのエレガントで効率的な方法はありますか?それとも早すぎる最適化についての引用を見て、これを忘れるべきですか?ここ*

答えて

20
printa(*cord()) 

はよく、私はそれが技術的に呼ばれるものを忘れて...引数拡張演算子であるが、このコンテキストでは、リストやタプルを取り、それを展開するので、関数は、各リスト/タプルの要素としては見ています別の引数。

それは基本的にあなたが関数定義内のすべての非キーワード引数をキャプチャするために使用する場合があります *の逆だ

def fn(*args): 
    # args is now a tuple of the non-keyworded arguments 
    print args 

fn(1, 2, 3, 4, 5) 

プリント(1, 2, 3, 4, 5)

fn(*[1, 2, 3, 4, 5]) 

同じこと。

+1

タプルです。 :-) –

+0

とドキュメント:http://docs.python.org/tutorial/controlflow.html#tut-unpacking-arguments – regan

+0

ありがとう、ジェイソン、私はそれを編集しました。 –

6

はこのお試しください:

>>> def cord(): 
...  return (1, 1) 
... 
>>> def printa(y, x): 
...  print a[y][x] 
... 
>>> a=[[1,2],[3,4]] 
>>> printa(*cord()) 
4 

スターを基本的に「位置引数としてこのコレクションの要素を使用しています。」と言いますあなたは2つの星を使ってキーワード引数のためのdictと同じ操作を行うことができます。

>>> a = {'a' : 2, 'b' : 3} 
>>> def foo(a, b): 
... print a, b 
... 
>>> foo(**a) 
2 3 
4

を実際に、Pythonは実際にそれがタプルにパック複数の値もできる一つの値を返す、複数の値を返しません。これは、複数の値を持つために返された値を "解凍"する必要があることを意味します。

x,y = cord() 

よう 文は、

printa(cord()) 

で行ったようにアスタリスクを使用する必要がある理由が、直接、それはですしない戻り値を使用していることを行います。おそらく、それは "暗黙的なタプルのアンパック"または "割り当てなしのタプルのアンパック"という言葉が良いでしょう。

関連する問題