Tupleに複数の値を返すPython関数があるとします。
def func():
return 1, 2
一時変数に割り当てるのではなく、結果の1つを無視する良い方法はありますか?最初の値にのみ興味がある場合、これよりも良い方法はありますか?
x, temp = func()
一般的な規則の1つは、無視するタプルの要素の変数名として「_」を使用することです。例えば:
def f():
return 1, 2, 3
_, _, x = f()
x = func()[0]
を使用して最初の値を返し、x = func()[1]
を使用して2番目の値を返すことができます。
一度に複数の値を取得する場合は、x, y = func()[2:4]
などを使用します。
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
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)
おそらく最善の解決策は、意味のないタプルを返すのではなく、名前を付けることです。返されたアイテムの順序の背後に何らかのロジックがない限り。
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)
返されるものがしばしば一緒になっている場合は、クラスを定義することをお勧めします。
これは私にとって最良の選択のようです:
val1, val2, ignored1, ignored2 = some_function()
それは不可解でもorくもなく(func()[index]メソッドのように)、目的を明確に述べています。
これは質問に対する直接的な答えではありません。むしろ、「多くの可能なオプションから特定の関数出力を選択するにはどうすればよいですか?」という質問に答えます。
関数を記述できる場合(つまり、変更できないライブラリにない場合)、関数から何を望むかを示す入力引数を追加します。 「一般的なケース」では、それを指定する必要さえないように、デフォルト値を持つ名前付き引数にします。
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は動的な型付けを行うため、戻り値の型が変わる可能性があります。この例がどのようにスカラー、リスト、またはタプルを返すかに注目してください。
これが常に使用する関数であり、常に2番目の引数を破棄する場合、lambda
を使用して2番目の戻り値なしで関数のエイリアスを作成する方が面倒ではないと主張します。
def func():
return 1, 2
func_ = lambda: func()[0]
func_() # Prints 1
関数から多くの出力があり、それを複数回呼び出したくない場合、結果を選択する最も明確な方法は次のようになると思います:
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