一般來說,無論是函式呼叫還是宣告,單個星號表示元組(或是列表)「出現」,而兩個星號則代表附近有字典「出沒」。
函式呼叫裡的*和**
check_web_server(host, port, path):
用check_web_server('127.0.0.1', 80, '/admin/')即可呼叫和這個函式。
那要是這些資訊在乙個三元組裡的話,例如host_info=('www.python.org', 80, '/'),這時呼叫就會變成check_web_server(host_info[0], host_info[1], host_info[2])。
這時單星號就可以解決,用下面的例子和上面的**是等價的:check_web_server(*host_info)。
而雙星號對字典的用法也類似,host_info=,
於是函式的呼叫就變成了:check_web_server(**host),這就告訴函式在開啟字典時,每個鍵時引數的名字,同時對應的值是函式呼叫的引數。
即它就等於check_web_server('host': 'www.python.org', 'port': 80, 'path': '/')
函式宣告裡的*和**
它們讓python得以支援變長引數,函式可接受任何數量的引數。
當定義乙個三個引數的函式時(沒有預設值的引數),呼叫者必須傳入正好三個引數。
如果需要更大的靈活性,則可以用單星號表示的元組來定義乙個變長引數,建立乙個daily_sales_total函式:
def daily_sales_total(*all_sales):
total=0.0
for each_sale in all_sales:
total+=float(each_sale)
return total
相應地合法函式呼叫有:
def daily_sales_total()
def daily_sales_total(10.00)
def daily_sales_total(5.00, 1.50, '128.75')
還可以把普通引數和變長引數混在一起使用,如def check_web_server(host, port, path, *args):
注意:在函式定義裡使用變長引數時,所有必須出現的引數一定先出現,然後是有預設值的引數,最後才是變長引數。
類似的,也可以在函式宣告裡用雙星號來接受任意數目的關鍵字引數,它們會在函式被呼叫的時候匯入到乙個字典裡去
def check_web_server(host, port, path, *args, **kwargs):
實際上,還有一種全部由變長引數組成的所謂通用python方法:def f(*args, **kwargs):
這樣的函式可以按照f(), f(a, b, c), f(a, b, foo=c, bar=d)等任何方式呼叫,它可以接受任意形式的輸入了。
動態建立字典:
>>> bobagrs=dict((f+ '_contains', 'bob') for f in ('title', 'subtitle', 'text', 'byline'))
>>> bobagrs
>>> bo=((f+ '_contains', 'bob') for f in ('title', 'subtitle', 'text', 'byline'))
>>> bo
at 0x1067705a0>
dict(bo)就可以把乙個迭代器轉換成字典型別。
>>> list(bo)
[('title_contains', 'bob'), ('subtitle_contains', 'bob'), ('text_contains', 'bob'), ('byline_contains', 'bob')]
>>> a=
>>> a.items()
[('a', 1), ('b', 2)]
>>> dict(a)
shell從函式檔案裡呼叫函式
碰到乙個shell中函式呼叫的小問題,記錄一下。shell中函式有三種呼叫方式,一種是在檔案前面定義函式,然後在以下直接呼叫 一種是通重載入shell,在shell中直接呼叫 第三種是將函式寫入檔案。然後在其它shell中呼叫函式。這裡寫一下關於第三種方法的樣例 is it a directory ...
函式柯里化 函式鏈式呼叫 lazyman
實現鏈式呼叫實現 add函式,add 1 2 3 4 輸出10,然後考慮拓展性 解析為add 1 返回函式a,a 2 返回函式b,b 3 返回函式c function add num 但是如果鏈式呼叫加長,這種方法顯然不能滿足需求 改進 function add num return func 這樣...
呼叫函式和被呼叫函式的關係
1 當在乙個函式的執行期間呼叫另乙個函式時,在執行被呼叫函式之前,系統需要完成三件事情 1 將所有的實參 返回位址等資訊傳遞給被呼叫函式儲存 2 為被呼叫函式的區域性變數分配儲存區 3 將控制轉移到被調函式的入口。2 從被呼叫函式返回到呼叫函式之前,系統要做三件事情 1 儲存被調函式的計算結果 2 ...