344

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

def func():
    return 1, 2

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

x, temp = func()
4

11 回答 11

697

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

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

于 2009-01-10T22:14:42.653 回答
305

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

def f():
    return 1, 2, 3

_, _, x = f()
于 2009-01-10T22:18:57.810 回答
131

如果您使用的是 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]
于 2009-01-11T21:15:51.383 回答
25

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

但是,为避免与该变量名的其他用途发生冲突(请参阅__响应),使用(双下划线) 作为一次性变量可能是一种更好的做法,正如ncoghlan所指出的那样。例如:

x, __ = func()
于 2015-03-06T10:01:14.027 回答
23

请记住,当您返回多个项目时,您实际上是在返回一个元组。所以你可以做这样的事情:

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2
于 2009-01-10T22:20:20.210 回答
18

三个简单的选择。

明显的

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)
于 2009-01-10T22:19:44.547 回答
17

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

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) 具有数据类,您可以使用这些数据类来用很少的代码行定义类:

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 相比,数据类的主要优势在于它更易于扩展,但还有其他区别。请注意,默认情况下,数据类是可变的,但您可以使用@dataclass(frozen=True)而不是@dataclass强制它们是不可变的。

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

于 2018-02-22T16:34:18.097 回答
5

如果这是一个你一直使用但总是丢弃第二个参数的函数,我认为在没有第二个返回值的情况下使用lambda.

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 
于 2017-10-13T14:46:36.503 回答
4

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

val1, val2, ignored1, ignored2 = some_function()

它既不神秘也不丑陋(如 func()[index] 方法),并且清楚地说明了您的目的。

于 2009-01-11T17:44:24.773 回答
4

这不是问题的直接答案。相反,它回答了这个问题:“我如何从许多可能的选项中选择一个特定的函数输出?”。

如果您能够编写函数(即,它不在您无法修改的库中),则添加一个输入参数,表明您希望从函数中得到什么。使其成为具有默认值的命名参数,因此在“常见情况”中您甚至不必指定它。

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

于 2014-03-08T20:42:09.717 回答
2

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

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

于 2017-10-18T20:37:48.107 回答