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

def func():
    return 1, 2

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

x, temp = func()

当前回答

如果这是一个一直使用但总是丢弃第二个参数的函数,我认为为没有使用lambda的第二个返回值的函数创建别名不那么混乱。

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

其他回答

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

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

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

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

x, __ = func()

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

def f():
    return 1, 2, 3

_, _, x = f()

如果你在使用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 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来强制它们是不可变的。

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