我应该何时在函数定义中使用子列表语法

时间:2016-02-01 04:57:32

标签: python python-2.7

7.6. Function Definitions of Python Language Reference中提供的函数定义的形式语法如下:

decorated      ::=  decorators (classdef | funcdef)
decorators     ::=  decorator+
decorator      ::=  "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
funcdef        ::=  "def" funcname "(" [parameter_list] ")" ":" suite
dotted_name    ::=  identifier ("." identifier)*
parameter_list ::=  (defparameter ",")*
                    (  "*" identifier ["," "**" identifier]
                    | "**" identifier
                    | defparameter [","] )
defparameter   ::=  parameter ["=" expression]
sublist        ::=  parameter ("," parameter)* [","]
parameter      ::=  identifier | "(" sublist ")"
funcname       ::=  identifier

注意sublist的{​​{1}}语法,例如以下函数定义:

parameter

但是,我从未见过任何使用过这种def f((a,b,c), d): return a,b,c,d 语法的Python代码(只是因为我对Python的经验非常有限)。以下是我的问题:

  • 与正式函数定义语法(kwargs,sublistsublist提供的其他可能性相比,*iterable语法在什么情况下会更好?数)

  • 是否有任何真实世界(即实际)用法示例才能使其真正有用?

1 个答案:

答案 0 :(得分:1)

一个原因是,如果数据本身最好表示为列表或元组,但是您指的是列表本身的单个元素。以此函数为例,计算2点之间的距离:

def distance_between_points((x1, y1), (x2, y2)):
    return math.sqrt((x2-x1)**2 + (y2-y1)**2)

这看起来比做得好:

def distance_between_points(p1, p2):
    return math.sqrt((p2[0]-p1[0])**2 + (p2[1]-p0[1])**2)