忽略python的多个返回值

说我有一个Python函数返回一个元组中的多个值:

def func(): return 1, 2 

有没有一种很好的方式来忽略其中一个结果,而不是仅仅分配一个临时variables? 说如果我只对第一个价值感兴趣,是否有比这更好的方法:

 x, temp = func() 

一个常见的惯例是使用“_”作为你想忽略的元组元素的variables名。 例如:

 def f(): return 1, 2, 3 _, _, x = f() 

您可以使用x = func()[0]返回第一个值, x = func()[1]返回第二个值,依此类推。

如果您想一次获取多个值,请使用x, y = func()[2:4]

如果你使用的是Python 3,你可以在一个variables(在一个赋值的左边)之前使用这个星形,使它成为一个解包列表。

 # 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] 

记住,当你返回多个项目时,你真的返回一个元组。 所以你可以做这样的事情:

 def func(): return 1, 2 print func()[0] # prints 1 print func()[1] # prints 2 

三个简单的select。

明显

 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) 

通常的做法是使用虚拟variables_ (单下划线),如前所述。

但是,为避免与其他variables名称的冲突(请参阅此响应),可能更好的做法是使用__ (双下划线)而不是ncoghlan指出的一次性variables。 例如:

 x, __ = func() 

这不是直接回答这个问题。 相反,它回答了这个问题:“我如何从许多可能的select中select特定的function输出?”。

如果你能写这个函数(即它不在一个库中,你不能修改),那么添加一个input参数来表示你想要的function。 使它成为一个默认值的命名参数,所以在“常见情况”,你甚至不必指定它。

  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 ) 

这种方法给出关于所需输出的function“高级警告”。 因此,它可以跳过不必要的处理,只做必要的工作来获得您想要的输出。 另外,因为Python没有dynamictypes,所以返回types可以改变。 注意这个例子是如何返回一个标量,一个列表或一个元组……不pipe你喜欢什么!

这对我来说似乎是最好的select:

 val1, val2, ignored1, ignored2 = some_function() 

这不是神秘或丑陋的(像func()[index]方法),并明确说明你的目的。

当你有很多函数的输出,而且你不想多次调用它,我认为select结果的最明确的方法是:

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

作为一个最小工作的例子,也certificate函数只被调用一次:

 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 a,b = [results[i] for i in [1,4]] 

价值如预期:

 results > [3,6,5,9,12,9] a > 6 b > 12 

为了方便起见,还可以使用Python列表索引:

 a,b = [results[i] for i in [0,-2]] 

返回:a = 3和b = 12

如果这是一个你始终使用的函数,但是总是放弃第二个参数,那么我会争辩说,为函数创build一个别名而没有使用lambda的第二个返回值是比较麻烦的。

 def func(): return 1, 2 func_ = lambda: func()[0] func_() # Prints 1