关于功能:忽略python多个返回值

Ignore python multiple return value

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

1
2
def func():
    return 1, 2

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

1
x, temp = func()


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

如果您希望一次获得多个值,请使用类似于x, y = func()[2:4]的东西。


一种常见的约定是使用"u"作为要忽略的元组元素的变量名。例如:

1
2
3
4
def f():
    return 1, 2, 3

_, _, x = f()


如果您使用的是python 3,那么可以使用变量前面的星号(在赋值的左侧)将其作为解包中的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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]


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

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

1
x, __ = func()

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

1
2
3
4
5
def func():
    return 1, 2

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

三个简单的选择。

明显的

1
2
3
x, _ = func()

x, junk = func()

丑陋的

1
x = func()[0]

有很多方法可以用一个装饰师来做这个。

1
2
3
4
5
6
def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)


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

如果您能够编写函数(即,它不在您无法修改的库中),则添加一个输入参数,指示您希望从函数中得到什么。将其设置为具有默认值的命名参数,这样在"常见情况"中甚至不必指定它。

1
2
3
4
5
6
7
8
9
    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执行动态类型,所以返回类型可以更改。注意示例如何返回标量、列表或元组…不管你喜欢什么!


这似乎是我的最佳选择:

1
val1, val2, ignored1, ignored2 = some_function()

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


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

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

latitude = func()['lat']
print(latitude)

如果要添加有关返回内容的额外信息,甚至可以使用name-duple:

1
2
3
4
5
6
7
8
from collections import namedtuple
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

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

latitude = func().lat
print(latitude)

如果您返回的内容经常在一起,那么为它定义一个类可能是一个好主意。


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

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

作为最基本的工作示例,还演示了只调用一次函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
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]]

值如预期:

1
2
3
4
5
6
results
> [3,6,5,9,12,9]
x
> 6
y
> 12

为了方便起见,还可以使用python列表索引:

1
x,y = [results[i] for i in [0,-2]]

返回:a=3,b=12


如果这是一个您一直在使用但总是放弃第二个参数的函数,那么我认为使用lambda为没有第二个返回值的函数创建别名就不那么麻烦了。

1
2
3
4
5
6
def func():
    return 1, 2

func_ = lambda: func()[0]

func_()  # Prints 1