Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:我们应该如何编写函数来返回对象/列表和布尔标志_Python_C++ - Fatal编程技术网

Python:我们应该如何编写函数来返回对象/列表和布尔标志

Python:我们应该如何编写函数来返回对象/列表和布尔标志,python,c++,Python,C++,在C/C++中,通常编写一个函数,返回成功或失败标志,并指示通过引用传递的对象/列表已准备好使用。比如说, bool get_list(List& l) { ... if (ready) { l = m_list } return ok } 在python中,我知道我们可以在一个函数中返回多个内容,但这看起来并不整洁。返回对象/列表和布尔标志的等效方法是什么 编辑 谢谢你的评论。我知道我们应该在现代C++代码中使用异常,但是你可以

在C/C++中,通常编写一个函数,返回成功或失败标志,并指示通过引用传递的对象/列表已准备好使用。比如说,

bool get_list(List& l)
{
    ...
    if (ready)
    {
        l = m_list
    }
    return ok
}
在python中,我知道我们可以在一个函数中返回多个内容,但这看起来并不整洁。返回对象/列表和布尔标志的等效方法是什么

编辑 谢谢你的评论。我知道我们应该在现代C++代码中使用异常,但是你可以看到很多类似的C/C++代码。正如我在问题中提到的,我知道我们可以在python中返回元组,也就是说,不止一件事——很抱歉没有使用python上下文。我认为我没有使用正确的例子,这导致了这里的混乱。例如,它可以类似于当某个成员变量准备好某些条件匹配时,您希望返回列表类型的成员变量。您可以使用一个标志来指示列表是否已准备好使用,而不是返回列表并在外部进行检查,这样更有效


但是根据下面的答案,返回元组是实现它的方法。

在python中,您可以返回值的元组

def get_object(object):
    # start of some code
    code
    # end of some code
    if ok:
        object = something

    return ok, object
然后有:

flag, result = get_object(myobj)
从OP编辑之后,还可能让get_对象成为一种Mutator函数,如下逻辑示例所示:

class classy(object):
    # this is your object
    def __init__(self):
        self.att = 1
        self.btt = 2

def mutate_obj(classy_obj):
    # this is your get_object for example
    # code
    ok = True  # or False whetever
    if ok:
        classy_obj.att = 10  # or a new classy, or any other object manipulation, on classy_obj
    return ok
然后: 在ipython:

In [4]: myclassy = classy()

In [5]: myclassy
Out[5]: <__main__.classy at 0x3c03250>

In [6]: myclassy.att
Out[6]: 1

In [7]: myclassy.btt
Out[7]: 2

In [8]: flag = mutator_func(myclassy)

In [9]: myclassy
Out[9]: <__main__.classy at 0x3c03250>

In [10]: myclassy.att
Out[10]: 10

既然您在问题中也标记了python,我将继续用python帮助您。介绍元组解包来拯救你,请用谷歌搜索出来

def do_something(*args, **kwargs):
    some_data_structure = []        # optionally choose whatever DS you want here
    some_flag = False
    # write your logic to change or set the flag
    if some_flag:
       # write some logic here to manipulate your DS now
        some_data_structure.append(1) # just an example
    return (some_flag, some_data_structure)
返回了\u标志,data\u structure=do\u something确保您研究了元组解包以理解它

但是,如果您认为需要坚持返回一个参数,那么可以检查some_data_结构中的元素,如果该结构为空,则表示some_标志为False


如果你需要更多的帮助,请到处玩,让我知道

基本上,您要做的是返回一个可选值。通常您根本不需要元组,因为额外的指示符标志是多余的。返回None是表示无值的常用方法。例如,Python内置字典的get方法返回存在的值,否则返回None或显式指定的替代值,但默认为None

这种模式非常常见,Python的新类型注释明确支持它作为可选的[SomeType],这意味着SomeType或None

因此,除非你不需要其他东西,否则解决问题的最惯用方法是:

def get_list():
    if ready:
        return the_list
    return None

在现代C++代码中,实际上不应该这样做。在C++中,如果可能的话,我们倾向于用const引用返回对象,如果事情变得像梨形的,则抛出异常。Python有非常好的例外。我想说的是,大多数情况下,我们的想法是只返回一个值,如果出现问题,则中断抛出异常。我没有写答案,@Netwave,OP说它看起来不整洁。事实上,事实并非如此。在现代C++ +C++ 17中,你有结构化的绑定,它的工作原理类似于返回一组值:Auto[i],[j]=函数,返回结构2,或两个值;变异函数是我想要的答案。非常感谢!