忽略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