忽略python的多个返回值

假设我有一个Python函数,在一个元组中返回多个值:

def func():
return 1, 2

有没有一种很好的方法来忽略一个结果,而不是仅仅分配给一个临时变量?如果我只对第一个值感兴趣,有没有比这更好的方法:

x, temp = func()
279294 次浏览

可以使用x = func()[0]返回第一个值,使用x = func()[1]返回第二个值,等等。

如果你想一次获得多个值,可以使用类似x, y = func()[2:4]的方法。

一种常见的约定是使用“_”作为您希望忽略的元组元素的变量名。例如:

def f():
return 1, 2, 3


_, _, x = f()

三个简单的选择。

明显的

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 1, 2


print func()[0] # prints 1
print func()[1] # prints 2

这似乎是我最好的选择:

val1, val2, ignored1, ignored2 = some_function()

它并不晦涩或丑陋(像func()[index]方法那样),并且清楚地阐明了您的目的。

如果你在使用python3,你可以在变量前使用星号(在赋值的左边),让它在解包时成为一个列表。

# 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 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是动态类型,所以返回类型可以改变。注意这个例子是如何返回标量、列表或元组的…你喜欢什么都行!

常见的做法是使用虚拟变量_(单个下划线),正如前面许多人指出的那样。

然而,为了避免与该变量名的其他用法发生冲突(参见 response),可能更好的做法是使用__(双下划线)作为丢弃变量,正如ncoghlan所指出的那样。例如:

x, __ = func()

如果这是一个你一直使用但总是丢弃第二个参数的函数,我认为使用lambda为没有第二个返回值的函数创建别名会更整洁。

def func():
return 1, 2


func_ = lambda: func()[0]


func_()  # Prints 1

当你从一个函数中有很多输出,而你不想多次调用它时,我认为选择结果的最清晰的方法是:

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

作为一个最小的工作示例,也演示了函数只被调用一次:

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

最好的解决方案可能是为事物命名,而不是返回毫无意义的元组(除非在返回项的顺序后面有一些逻辑)。例如,你可以使用字典:

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

latitude = func()['lat']

你甚至可以使用namedtuple,如果你想添加关于你要返回的东西的额外信息(它不仅仅是一个字典,它是一对坐标):

from collections import namedtuple


Coordinates = namedtuple('Coordinates', ['lat', 'lng'])


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


latitude = func().lat

如果你的字典/元组中的对象是强绑定在一起的,那么为它定义一个类可能是一个好主意。这样,您还可以定义更复杂的操作。接下来的一个自然问题是:什么时候应该在Python中使用类?

python的最新版本(≥3.7)有dataclasses,你可以用很少的代码行定义类:

from dataclasses import dataclass


@dataclass
class Coordinates:
lat: float = 0
lng: float = 0


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


latitude = func().lat

与namedtuple相比,数据类的主要优点是它更容易扩展,但是存在其他的差异. xml。注意,默认情况下,数据类是可变的,但你可以使用@dataclass(frozen=True)而不是@dataclass来强制它们是不可变的。

这是一个视频,它可以帮助你为你的用例选择正确的数据类。