Python函数参数是否包含在元组中或仅包含在传统括号中?

时间:2016-05-16 06:43:37

标签: python

函数是否将参数括在括号中,因为它们是作为元组处理的,还是只是f(x)约定的结果?

即。是(b,a,r)这里的元组:

def foo(b, a, r):
    pass

或者,它更像是在数学方程式中使用括号的方式,例如

>>> 3 * 2 + 1
7
>>> 3 * (2 + 1)
9

2 个答案:

答案 0 :(得分:3)

Python并没有将它们视为元组。例如,元组不会使用keyword=value个参数,但调用语法

元组不是由括号构成的,它们是由逗号组成的,当你从其他逗号使用中消除元组的歧义时,你只需要在元组周围使用括号在Python中。就像在函数调用中一样,逗号分隔位置参数。

Python语法将调用中的括号和逗号定义为part of the call expression syntax

call                 ::=  primary "(" [argument_list [","]
                          | expression genexpr_for] ")"

而其他地方的元组被定义为由逗号组成。见expression lists

expression_list ::=  expression ( "," expression )* [","]
     

包含至少一个逗号的表达式列表会产生一个元组。元组的长度是列表中表达式的数量。

请注意,只有","逗号是文字语法的一部分,此处的(...)括号是定义语法的语法的一部分。

括号的另一种用法(分组表达式)在parethezised forms中定义:

  

带括号的表单是括在括号中的可选表达式列表,再次注明文字"("")"字符:

parenth_form ::=  "(" [expression_list] ")"
     

带括号的表达式列表产生表达式列表产生的任何内容:如果列表包含至少一个逗号,则产生一个元组;否则,它会产生构成表达式列表的单个表达式。

Python语法中还有一些地方使用括号,请参阅full grammar specification;这些通常会回调调用语法(例如functionclass定义,装饰器)或带括号的形式(例如,对导入的名称进行分组),以及generator expressions

答案 1 :(得分:1)

您可以通过查看Python Grammar.

来回答这个问题

相关的行是:

funcdef: 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'

因此,在您的示例中,语法会说(b, a, r)是括号括起来的typedargslist