返回语句是否应该有括号?

时间:2011-02-12 14:24:47

标签: python

假设我们在Python 3.x中(我猜想在Python 2.6和Python 2.7中也有)以下函数:

>>> def dbl_a(p): return p*2
>>> def dbl_b(p): return(p*2)
>>> def dbl_c(p): return (p*2)

如果我们运行它们,我们得到:

>>> dbl_a(42)
84
>>> dbl_b(42)
84
>>> dbl_c(42)
84

这三个函数提供相同的结果(值和类型),它们似乎是等价的。

但是哪一个有更正确的return陈述?

这些定义中是否存在任何副作用?

同样的问题适用于返回多个值的以下情况:

>>> def dbl_triple_a(p): return p*2, p*3
>>> def dbl_triple_b(p): return(p*2, p*3)
>>> def dbl_triple_c(p): return (p*2, p*3)

>>> dbl_triple_a(42)
(84, 126)
>>> dbl_triple_b(42)
(84, 126)
>>> dbl_triple_c(42)
(84, 126)

在这种情况下,每个函数都会返回元组,但我的问题仍然保持不变。

5 个答案:

答案 0 :(得分:32)

return value是“正确的”方式 - return是语言结构,而不是函数。

如果要返回元组,请使用return your, values, here

不需要任何括号(元组由,“运算符创建”,而不是()

答案 1 :(得分:23)

Python中的括号()通常有4种用途。

  1. 它的行为与大多数其他主流语言的行为方式相同 - 它是强制评估优先级的结构,就像在数学公式中一样。这也意味着它只在必要时使用,比如当你需要确保在乘法和除法之前首先发生加法和减法时。
  2. 它是一个将不可变值组合在一起的构造,其精神与数学中类似的集合符号相同。我们称之为Python中的元组。元组也是一种基本类型。它是一个构造空元组并强制运算符优先级提升。
  3. 它用于在导入语句中将导入的名称组合在一起,因此您不必使用多行分隔符\。这主要是风格。
  4. 在长篇陈述中
  5. 
        decision = (is_female and under_30 and single
                    or
                    is_male and above_35 and single)
    
    

    括号是一种替代语法,可避免达到80列限制,并且必须使用\进行语句延续。

    在任何其他情况下,例如在ifwhilefor谓词和return语句中,我强烈建议您不要使用()除非必要或辅助可读性(由上述4点定义)。获得这一点的一种方法是,在数学中,(1)1只意味着完全相同的事情。在Python中也是如此。

    来自C语言系列的人将需要一点点习惯,因为出于历史原因,这些语言中的控制流谓词需要()

    return语句的最后一个单词,如果只返回1个值,则省略()。但是如果你要返回多个值,可以使用(),因为现在你要返回一个分组,()可以直观地强制执行。然而,最后一点是风格的,并且受到偏好。请注意,return关键字会返回语句的结果。因此,如果您只在多个赋值语句和元组结构中使用,,请省略(),但如果您使用()进行值解包和元组结构,请在()时使用return您将在{{1}}中返回多个值。保持一致。

答案 2 :(得分:6)

通常,惯例是不在return语句中使用括号,因为它不是函数。在这种情况下,解析器只是完全忽略括号。

元组通常用括号表示,以提高可读性,但不需要它们。

然而,最终,它们的功能完全相同,而且归结为偏好。

答案 3 :(得分:2)

7.6。 return语句

return_stmt ::=  “return” [expression_list]

expression_list

  

return只能在语法上嵌套在函数定义中,而不能嵌套在类定义中。

     

如果存在表达式列表,则对其进行评估,否则替换为无。

     

return将当前函数调用与表达式列表(或None)一起作为返回值。

     

当return返回带有finally子句的try语句的控制权时,在真正离开函数之前执行finally子句。

     

在生成器函数中,return语句指示生成器已完成并将引发StopIteration。返回值(如果有)用作构造StopIteration的参数,并成为StopIteration.value属性。

     

在异步生成器函数中,空的return语句指示异步生成器已完成并将引发StopAsyncIteration。非空返回语句是异步生成器函数中的语法错误。

所以基本上return是一个带有可选表达式列表作为参数的语句。因此,括号不是必需的,只有在需要时才是优选的(即,为了打破优先权)。

答案 4 :(得分:-3)

在(几乎)任何情况下,如有疑问,请使用括号!

看到他们都完全一样,我认为这是个人偏好的问题。我会选择最后一个。

但话说回来,我对python并不熟悉。