假设我有一个Python函数,在一个元组中返回多个值:
def func():
return 1, 2
有没有一种很好的方法来忽略一个结果,而不是仅仅分配给一个临时变量?如果我只对第一个值感兴趣,有没有比这更好的方法:
x, temp = func()
假设我有一个Python函数,在一个元组中返回多个值:
def func():
return 1, 2
有没有一种很好的方法来忽略一个结果,而不是仅仅分配给一个临时变量?如果我只对第一个值感兴趣,有没有比这更好的方法:
x, temp = func()
当前回答
您可以使用x = func()[0]返回第一个值,x = func()[1]返回第二个值,依此类推。
如果你想一次获得多个值,可以使用x, y = func()[2:4]。
其他回答
记住,当返回多个元素时,实际上返回的是一个元组。所以你可以这样做:
def func():
return 1, 2
print func()[0] # prints 1
print func()[1] # prints 2
三个简单的选择。
明显的
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 f():
return 1, 2, 3
_, _, x = f()
如果您愿意,可以用更少的语法忽略除第一个变量以外的所有变量。如果我们以你为例
# The function you are calling.
def func():
return 1, 2
# You seem to only be interested in the first output.
x, temp = func()
我发现以下工作,
x, *_ = func()
这种方法将所有其他变量“解包”为“一次性”变量_。这样做的好处是只指定一个你想要的变量,而忽略它后面的所有变量。
然而,在许多情况下,您可能希望输出不是函数的第一个输出。在这些情况下,最好使用func()[i]来表示,其中i是您想要的输出的索引位置。在你的情况下,
# i == 0 because of zero-index.
x = func()[0]
顺便说一句,如果你想在Python 3中变得更漂亮,你可以这样做,
# This works the other way around.
*_, y = func()
你的函数只输出两个潜在变量,所以这看起来不是很强大,直到你遇到这样的情况,
def func():
return 1, 2, 3, 4
# I only want the first and last.
x, *_, d = func()
最好的解决方案可能是为事物命名,而不是返回毫无意义的元组(除非在返回项的顺序后面有一些逻辑)。例如,你可以使用字典:
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来强制它们是不可变的。
这里有一个视频,可以帮助您为您的用例选择正确的数据类。