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

def func():
    return 1, 2

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

x, temp = func()
有帮助吗?

解决方案

一个常见的惯例是使用“_”。作为要忽略的元组元素的变量名。例如:

def f():
    return 1, 2, 3

_, _, x = f()

其他提示

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

如果您想一次获得多个值,请使用 x,y = func()[2:4] 之类的内容。

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

请记住,当你返回多个项目时,你真的会返回一个元组。所以你可以做这样的事情:

def func():
    return 1, 2

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

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

但是,为了避免与该变量名称的其他用途发生冲突(请参阅回复),这可能是更好的做法使用 __ (双下划线)代替一次性变量,如 ncoghlan 所指出的那样。 E.g:

x, __ = func()

三个简单的选择。

明显

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)

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

val1, val2, ignored1, ignored2 = some_function()

它不是神秘的或丑陋的(如func()[index]方法),并明确说明你的目的。

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

如果您能够编写该函数(即,它不在库中,您无法修改),则添加一个输入参数,指示您想要从函数中删除的内容。使其成为具有默认值的命名参数,因此在“常见情况”中你甚至不必指定它。

    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执行动态类型,返回类型可以更改。注意该示例如何返回标量,列表或元组......无论你喜欢什么!

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

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

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

您甚至可以使用 namedtuple 如果你想添加关于你要返回的内容的额外信息:

from collections import namedtuple 
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

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

latitude = func().lat
print(latitude)

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

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

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

如果你有一个函数输出很多而你不想多次调用它,我认为选择结果最明确的方法是:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top