从Python中的函数返回多个值的最佳方法是什么?


76

我有一个函数,需要对字符串进行处理。我需要该函数返回一个布尔值,该布尔值指示操作是否成功,并且还需要返回修改后的字符串。

在C#中,我将为字符串使用out参数,但是Python中没有等效的参数。我对Python还是很陌生,我唯一想到的就是用布尔值和修改后的字符串返回一个元组。

相关问题:函数返回多个值是否为pythonic?


我添加了一个指向相关问题的链接
jfs

Answers:


134
def f(in_str):
    out_str = in_str.upper()
    return True, out_str # Creates tuple automatically

succeeded, b = f("a") # Automatic tuple unpacking

3
我想补充一点,目前的方法也适用于数组和矩阵
Nicholas

30

如果操作失败,为什么不引发异常?就个人而言,我倾向于认为,如果您需要从一个函数返回多个值,则应该重新考虑是否以正确的方式执行操作或使用对象。

但更直接的一点是,如果引发异常,则迫使他们处理问题。如果尝试返回一个指示失败的值,则很可能有人无法检查该值并最终导致一些潜在的难以调试的错误。


1
同意 当一个函数比另一个函数的可能性大得多时,Pythonic函数不应返回表示“成功/失败”的代码。在特殊情况下,请抛出异常。话虽这么说,只是在需要时返回一个元组:“返回a,b,c”
Dan Lenski

8
我不喜欢为非致命错误引发异常的函数。
Seen Osewa

4
当常见故障时,在元组中返回故障信息是一种好方法。示例是一个函数,您使用测试值多次调用该函数以找到“好”值,您希望它多次失败并最终找到一个好值。在那种情况下,只是“返回结果,推理”,而不是引发异常。
格雷厄姆

17

返回一个元组。

def f(x):
    # do stuff
    return (True, modified_string)

success, modified_string = f(something)

我的搭档与我争论天气应该增加() 何时返回多值。当我用Pycharm编写代码时,ide会在用来返回多个值的行上显示破损(),但是在pep8上找不到代码样式规则。您如何看待?谢谢。
Vi.Ci


3

为失败而引发异常是进行操作的一种好方法,如果返回许多不同的值,则可以返回一个元组。对于您所引用的特定情况,我经常采用一种中间方法:成功时返回修改后的字符串,失败时返回None。我有足够的未重组的C程序员想要在失败时返回指向char的NULL指针。

如果我正在编写一个例程,将其用作更大的库的一部分并供其他开发人员使用,则在失败时会抛出异常。当我吃自己的狗食时,我可能会返回不同类型的食物,并测试返回的食物。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.