如何从函数中检索所有返回的变量?

时间:2012-09-30 21:22:21

标签: python variables random

import random

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return False
    return example, other_example

使用此示例,可能会返回一个或两个变量。通常,对于一个变量,我会使用var = some_function()而使用var, var2 = some_function()。如何判断函数返回了多少变量?

5 个答案:

答案 0 :(得分:2)

尝试这样的事情:

>>> lis=(1,)[:2] #just one value, 
>>> lis
(1,)


>>> lis=(1,2)[:2]   #two values
>>> lis
(1, 2)


>>> lis=(1,2,3,4,5)[:2]  #any number of values
>>> lis
(1, 2)

# used [:2] here, because you only expect a maximum of 2 values
# use [:] to collect any number of values                  

但这种方法的唯一问题是你需要在每个tuple语句中返回return, 因此return False变为return False,

使用iter(),这也期望你总是返回一个元组或任何可迭代的元素:

>>> ret=((1,))
>>> ret=iter((1,))
>>> a,b=ret.next(),list(ret)[:1]  #used [:1] coz we need to store only 2 elements
>>> a,b
(1, [])


>>> ret=iter((1,2))
>>> a,b=ret.next(),list(ret)[:1]
>>> a,b
(1, [2])

>>> ret=iter((1,2,3,4))
>>> a,b=ret.next(),list(ret)[:1]
>>> a,b
(1, [2])

答案 1 :(得分:2)

无法保证告诉返回单个tuple的函数与返回多个非元组值的函数之间的区别。但是,如果您知道该函数未返回tuple,则可以使用此代码检查多个返回值:

return_val = some_function()
if isinstance(return_val, tuple):
    # number of returned values is len(return_val)
    if len(return_val) == 2:
        var, var2 = return_val
else:
    # returned a single non-tuple item
    var = return_val

然而,处理此问题的最佳方法是编写在不同情况下不返回不同数量值的函数。相反,你可以做点像......

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return False, None
    return example, other_example

...这样函数总是返回两个值。或者,您始终可以返回单个元组,并检查该元组中的元素数量(例如,返回空元组()或具有单个错误值(False,)的元组。< / p>

答案 2 :(得分:1)

var_returned = some_function()
num_vars = len(vars_returned) if (not vars_returned == False) else 0
然后三元!这可以做得更短。

vars_returned = 7, 2
num_vars = len(vars_returned) if vars_returned else 0
print(num_vars)
# 2

vars_returned = False
num_vars = len(vars_returned) if vars_returned else 0
print(num_vars)
# 0 

答案 3 :(得分:1)

为什么不试试这个:

import random

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return ()
    return example, other_example

这样你总是会有一个元组作为返回值,但是当你想要它时,元组会测试为False。像这样使用它:

answer = some_function()
if answer:
     var1, var2 = answer

答案 4 :(得分:1)

让函数返回显着不同类型的函数是不好的做法。通常,如果函数返回元组,它将始终返回元组,并且它们将始终具有相同数量的项,除非它们返回None。原因正是促使你提出这个问题的原因:很难解释给定的回报值。在你调用函数的任何地方,你都会有解码返回值的开销。任何文档都必须解释每种情况下预期的输出。

有很多合理的选择。您可以返回在某些上下文,字典或collections.namedtuple中包装数据的对象。或者,对于大多数真实世界的代码,您可以将其划分为更容易理解的不同行的函数。