web-dev-qa-db-ja.com

pythonの複数の戻り値を無視

Tupleに複数の値を返すPython関数があるとします。

def func():
    return 1, 2

一時変数に割り当てるのではなく、結果の1つを無視する良い方法はありますか?最初の値にのみ興味がある場合、これよりも良い方法はありますか?

x, temp = func()
239
Mat

一般的な規則の1つは、無視するタプルの要素の変数名として「_」を使用することです。例えば:

def f():
    return 1, 2, 3

_, _, x = f()
209
Brian Clapper

x = func()[0]を使用して最初の値を返し、x = func()[1]を使用して2番目の値を返すことができます。

一度に複数の値を取得する場合は、x, y = func()[2:4]などを使用します。

511
Luke Woodward

Python 3を使用している場合、変数の前(割り当ての左側)にあるスターを使用して、展開するリストにすることができます。

# Example 1: a is 1 and b is [2, 3]

a, *b = [1, 2, 3]

# Example 2: a is 1, b is [2, 3], and c is 4

a, *b, c = [1, 2, 3, 4]

# Example 3: b is [1, 2] and c is 3

*b, c = [1, 2, 3]       

# Example 4: a is 1 and b is []

a, *b = [1]

複数のアイテムを返す場合、実際にはTupleを返すことに注意してください。したがって、次のようなことができます。

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2
16
Evan Fosmark

3つの簡単な選択。

明らか

x, _ = func()

x, junk = func()

恐ろしいです

x = func()[0]

そして、デコレーターでこれを行う方法があります。

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)
14
S.Lott

おそらく最善の解決策は、意味のないタプルを返すのではなく、名前を付けることです。返されたアイテムの順序の背後に何らかのロジックがない限り。

def func():
    return {'lat':1, 'lng':2}

latitude = func()['lat']
print(latitude)

返すものに関する追加情報を追加する場合は、 namedtuple を使用することもできます。

from collections import namedtuple 
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

def func():
    return Coordinates(lat=1, lng=2)

latitude = func().lat
print(latitude)

返されるものがしばしば一緒になっている場合は、クラスを定義することをお勧めします。

4
cglacet

これは私にとって最良の選択のようです:

val1, val2, ignored1, ignored2 = some_function()

それは不可解でもorくもなく(func()[index]メソッドのように)、目的を明確に述べています。

4
kmelvn

これは質問に対する直接的な答えではありません。むしろ、「多くの可能なオプションから特定の関数出力を選択するにはどうすればよいですか?」という質問に答えます。

関数を記述できる場合(つまり、変更できないライブラリにない場合)、関数から何を望むかを示す入力引数を追加します。 「一般的なケース」では、それを指定する必要さえないように、デフォルト値を持つ名前付き引数にします。

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        Elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

このメソッドは、目的の出力に関する「高度な警告」機能を提供します。その結果、不要な処理をスキップし、目的の出力を得るために必要な作業のみを行うことができます。また、Pythonは動的な型付けを行うため、戻り値の型が変わる可能性があります。この例がどのようにスカラー、リスト、またはタプルを返すかに注目してください。

4
1-ijk

これが常に使用する関数であり、常に2番目の引数を破棄する場合、lambdaを使用して2番目の戻り値なしで関数のエイリアスを作成する方が面倒ではないと主張します。

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 
2
Chrigi

関数から多くの出力があり、それを複数回呼び出したくない場合、結果を選択する最も明確な方法は次のようになると思います:

results = fct()
a,b = [results[i] for i in list_of_index]

最小限の作業例として、関数が1回だけ呼び出されることも示します。

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]

results=fct(3)
> fct called

x,y = [results[i] for i in [1,4]]

そして、値は予想通りです:

results
> [3,6,5,9,12,9]
x
> 6
y
> 12

便宜上、Pythonリストインデックスも使用できます。

x,y = [results[i] for i in [0,-2]]

戻り値:a = 3およびb = 12

2
jeannej