タプルを引数に展開する


411

Pythonタプルを関数に拡張する方法はありますか-実際のパラメータとして?

たとえば、ここexpand()に魔法があります:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

myfunとして定義できることは知っていますmyfun((a, b, c))が、もちろん、レガシーコードが存在する場合もあります。ありがとう

回答:


734

myfun(*some_tuple)まさにあなたが要求することをします。*オペレータは、単にタプル(または任意の反復可能)を解凍し、関数に位置引数として渡します。引数の解凍の詳細をご覧ください


8
*演算子は、タプルをアンパックして、位置引数として関数に渡します。もっとここを参照してください:docs.python.org/3/tutorial/...
john_mc

4
リストとタプルに同じ構文を使用できることに注意してください。
brendon-ai 2017

リスト(実際には、文字列を含むすべての反復可能オブジェクト)でも同じことができることがわかりましたが、それらの可変性がどのように影響するかはわかりません。調べてみると面白いでしょう。
wcyn 2017年

52

引数リストの一部を展開することもできます:

myfun(1, *("foo", "bar"))

13
展開されたタプルが通常提供される引数の後にある場合にのみ、これを実行できるようですsome_func(*tuple_of_stuff, another_argument)
Tom Galvin

6
@Quackmatic展開されたタプルを任意の場所に置くと、Python 3.5.1で正常に機能するようです
River

1
@Quackmatic seconding @River、これは、Python 3.5.4で正常に動作します:def func(a,b,c,d): print(a,b,c,d)args = ('fee', 'fi', 'fo'); func(*args, 'fum')
R.ナヴェガ

15

見てみましょうPythonのチュートリアルセクション4.7.3および4.7.4を。引数としてタプルを渡すことについて話します。

タプルを使用してシーケンスを渡す代わりに、名前付きパラメーターを使用する(およびディクショナリーを渡す)ことも検討します。位置が直感的でない場合、または複数のパラメーターがある場合、位置引数の使用は悪い習慣であると思います。


8

これは関数型プログラミング手法です。タプル拡張機能を構文シュガーから外します:

apply_tuple = lambda f, t: f(*t)

使用例:

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

カレーの再定義により、長期的にはapply_tuple多くのpartial呼び出しが節約されます。


5
これは初心者には役に立ちません。それはサードパーティのモジュールを使用し、他の混乱することをします...
gberger '26

gbergerはlambda f, t: f(*t)サードパーティのモジュールを使用していません。私はPythonの初心者であり、これは私に役立ちます。これは純粋な機能的アプローチです。このスタイルを使用しない場合、この答えはあなたのためではありません。
Dominykas Mostauskis 2017年

1
バーチャルツールは、サードパーティである、私が何を意味するのかである
gberger

5
すべての答えが初心者向けである必要はありません
ジョーダン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.