2016-02-01 27 views
3

正式語法功能定義,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語法parameter,這就有可能例如下面的函數定義:

def f((a,b,c), d): 
    return a,b,c,d 

但是,我從來沒有見過任何Python代碼使用過這種sublist語法(只是我的Python的經驗非常有限)。這裏是我的問題:

  • 在什麼情況下相比,正式的函數定義語法提供的其他可能性將在sublist語法是一個更好的主意(kwargs,*iterable**mapping,僅舉幾例)?

  • 是否有任何真實世界(即實際)使用的例子,使其實際有用?

+5

注意,這個語法是在Python 3 –

+0

刪除@ TadhgMcDonald - 延森哦,感謝那,給你和python社區。 – Naitree

+1

刪除語法的推理可以在這裏查看:http://legacy.python.org/dev/peps/pep-3113/ –

回答

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) 
相關問題