忽略python多个返回值


274

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

def func():
    return 1, 2

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

x, temp = func()

2
我也对Matlab的类似的“ 忽略函数输出”概念感到好奇,它们将它们~用作忽略特定返回变量的语法
jxramos

3
您选择了错误的答案作为解决方案
AGP

Answers:


241

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

def f():
    return 1, 2, 3

_, _, x = f()

89
-1:将“ gettext”功能添加到其他人的代码(定义了一个名为“ _”的功能)时,这种“约定”很糟糕,因此应予以禁止
nosklo

27
很好-尽管gettext是否坚持安装名为“ 的函数是否是一个好主意尚有争议就个人而言,我觉得它有点难看。无论如何,广泛使用“ ”作为一次性变量。
布赖恩·克拉珀

25
-1:_表示IPython中的“最后输出”。我永远不会给它分配任何东西。
endlith 2010年

20
好的,我没有注意到“我”-感谢您的参考。恕我直言,您不能指望其他人不仅仅因为一个Python应用程序为其定义了魔术用途就使用了变量。
Draemon

8
一些IDE(例如PyDev)会对此警告,因为您有未使用的变量。
teeks99 2011年

593

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

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


92
这应该是公认的答案。您也可以使用类似func()[2:4]只需要一些返回值的方法。
endlith 2011年

11
它不会多次调用该函数:>>> def test():...打印“此处” ...返回1,2,3 ... >>> a,b = test()[:2 ]此处[编辑:对不起代码没有通过,显然您只能在注释中添加一行。对于那些不熟悉的>>>和...是python shell中新行的开始]
teeks99 2011年

32
@TylerLong:我认为_, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()没有多次调用该函数还不清楚,但这只是我的看法。如果您的函数返回那么多项目,我认为使用numpy将是更可取的:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
endolith 2013年

24
@endolith我认为这更好,不需要numpy,也不需要多次调用func():result = func() a = result[13] b = result[25]...
Tyler Long

3
当您想忽略两者之间的一个或几个值时,这种样式不太好,例如x, __, y = func()
ndemou

96

如果您使用的是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]

2
您还可以使用a, *_ = f()忽略后的任意数量的返回值a
THN

21

请记住,当您返回多个项目时,您实际上是在返回一个元组。因此,您可以执行以下操作:

def func():
    return 1, 2

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

17

通常的做法是使用哑变量_(单个下划线),正如前面在此处指出的那样。

但是,为了避免与该变量名的其他用法冲突(请参阅响应)__,如ncoghlan所指出的那样,最好使用(双下划线)代替一次性变量。例如:

x, __ = func()

一点也不坏。但是然后'_ _'将在命名空间中声明一个变量。而_除非在上面的赋值语句的左侧特别使用(例如:),否则不声明a, _, _ = 1,8,9。在此之前,它将存储最后执行的语句的结果,如果要捕获该语句,通常会使用变量来存储该值。这就是为什么'_'是建议的变量名称以捕获垃圾值的原因。_值在执行另一条语句后很快被覆盖。在“ _ _”的情况下,值将一直保留在那里,直到GC将其清除为止。
Archit Kapoor

16

三个简单的选择。

明显

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)

5
我真的更喜欢_变量。很明显,您正在忽略一个值
Claudiu

21
您的示例是倒退的。 x, _ = func()很丑陋,x = func()[0]很明显。分配给变量然后不使用它?该函数返回一个元组;像元组一样对其进行索引。
endlith 2013年

6
在模式匹配语言(Python派生出这种模式)中,“显而易见”方法确实很明显,而不是丑陋且规范的。尽管在此类语言中,通配符是受支持的语言功能,而在Python中,通配符是一个实变量并受到绑定,这有点令人讨厌。
2013年

4
对于派生自Python的列表处理语言,;)列表访问器(例如a[0]a[:](列表副本),a[::2](每两个元素)和a[i:] + a[:i](旋转列表))确实是显而易见的并且是规范的。
cod3monk3y 2014年

7

最好的解决方案可能是命名事物,而不是返回无意义的元组。除非返回的项目的顺序背后有逻辑。

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

如果字典/元组中的对象紧密地绑在一起,那么甚至最好为其定义一个类。这样,您还可以定义此类型对象之间的交互,并提供有关如何使用它们的API。接下来的自然问题是:什么时候应该在Python中使用类?


4

在我看来,这似乎是最佳选择:

val1, val2, ignored1, ignored2 = some_function()

它不是神秘的或丑陋的(就像func()[index]方法一样),并且清楚地说明了您的目的。


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进行动态类型化,所以返回类型可以更改。请注意,示例如何返回标量,列表或元组……随您便!


2

如果这是您一直使用的函数,但始终舍弃第二个参数,那么我认为无需使用第二个返回值就可以为该函数创建别名不会太麻烦lambda

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.