繁体   English   中英

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

[英]How can I retrieve all the returned variables from a function?

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() 我如何知道该函数正在返回多少变量?

尝试这样的事情:

>>> 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                  

但是这种方法的唯一问题是,您需要在每个return语句中返回一个tuple ,因此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])

无法保证分辨返回单个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,)的元组(False,)

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 

为什么不试试这个:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM