函數的參數: 先來安利一下:定義函數的時候,咱們把參數的名字和位置肯定下來,函數的接口就定義完了。 對於函數的調用者來講,只須要知道如何傳遞正確的參數,以及函數返回什麼樣的值就夠了, 函數內部的複雜邏輯被封裝起來,調用者無需瞭解。 Python的函數定義很是簡單,可是卻很是靈活。除了正常定義的必選參數外,還可使用默認參數, 可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理複雜的參數,還能夠簡化 調用者的代碼。 只要函數執行到return 函數就會中止執行 # 1. 每一個函數若是在函數中不寫return, 默認返回None # 2. 咱們也能夠只寫一個return, 也是返回None, 中止函數的執行 # 3. return 一個返回值. 你在調用方能接受到一個返回值 # 4. return 多個返回值. 多個值須要用,隔開 接收的位置. 接收的是元組. # 函數return返回多個值以元祖(tuple)存儲 1.位置參數 def fun(a): return a+a print(fun(3))#6 對於fun(a)函數,參數a就是一個位置參數。 當咱們調用fun函數時,必須傳入有且僅有的一個參數x def fun(x,n) x = x **n return x print(fun(2,4))#16 x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次付給參數x和n 2.默認參數 def fun(x,n=2): x = x **n return x print(fun(2))#4 print(fun(2,4))#16 默認參數能夠簡化函數的調用。設置默認參數時,需注意: 1)必選參數在前,默認參數在後,不然python解釋器會報錯 2)如何設置默認參數:當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。 變化小的參數就能夠做爲默認參數。 使用默認參數有什麼好處呢:最大的好處就是可以下降調用函數的難度。 注意:默認參數的一個坑 例子: def add(l=[]): l.append('a') return l #正常調用時,結果正常 print(add([1, 2, 3]))#[1, 2, 3, 'a'] print(add([5, 4, 3]))#[5, 4, 3, 'a'] #當使用默認參數調用時,一開始結果還正確,但是再此調用就不對了 print(add())#['a'] print(add())#['a', 'a'] 緣由解釋: Python函數在定義的時候,默認參數l的值就被計算出來了,即[],由於默認場參數l也是一個變量, 他指向對象[],每次調用函數,若是改變了l的內容,則下次調用時,默認參數的內容就變了,再也不 是函數定義時的[]了。 注:定義默認參數要記牢一點:默認參數必須指向不變對象。 解決上述問題: def add(L=None): if L is None: L=[] L.append('a') return L 3.可變參數 def fun(*n): sum = 0 for i in n: sum += i return sum print(fun(1,2,3))#6 lis = [1,2,3] print(fun(*lis))#6 tu = (1,2,3) print(fun(*tu))#6 注意:因爲參數不肯定,因此咱們就傳入一個可變參數*n,Python容許你在list或tuple前面加一個*號, 把list或tuple的元素變成可變參數傳進去。 4.關鍵字參數 可變參數容許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple。 而關鍵字參數容許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。 def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person('Michael', 3)#name: Michael age: 3 other: {} person('A', 4, g='M', j='E')#name: A age: 4 other: {'g': 'M', 'j': 'E'} 關鍵字參數有什麼用?:它能夠擴展函數的功能。好比,在person函數裏,咱們保證能接收到name和age這兩個參數, 可是,若是調用者願意提供更多的參數,咱們也能收到。試想你正在作一個用戶註冊的功能,除了用戶名和年齡 是必填項外,其餘都是可選項,利用關鍵字參數來定義這個函數就能知足註冊的需求。 5.命名關鍵字參數: <1> 對於關鍵字參數,函數的調用者能夠傳入任意不受限制的關鍵字參數。 def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person('JackChen', 20, city='shanghai', addr='shanxi', zipcode=123) <2> 若是要限制關鍵字參數的名字,就能夠用命名關鍵字參數. 例如,只接收city和job做爲關鍵字參數。這種方式定義的函數以下: def person(name, age, *, city, job): print(name, age, city, job) #和關鍵字參數**kw不一樣,命名關鍵字參數須要一個特殊分隔符*, #*後面的參數被視爲命名關鍵字參數。 person('Jack', 20, city='Beijing', job='Engineer')#Jack 20 Beijing Engineer <3> 若是函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就再也不須要一個特殊分隔符 *了: def person(name, age, *args, city, job): print(name, age, args, city, job) #命名關鍵字參數必須傳入參數名,這和位置參數不一樣。若是沒有傳入參數名,調用將報錯. person('Jack', 20, 'Beijing', 'Engineer') #Traceback (most recent call last): # File "<stdin>", line 1, in <module> #TypeError: person() takes 2 positional arguments but 4 were given 因爲調用時缺乏參數名city和job,Python解釋器把這4個參數均視爲位置參數, 但person()函數僅接受2個位置參數。 <4> 命名關鍵字參數能夠有缺省值,從而簡化調用: def person(name, age, *, city='Beijing', job): print(name, age, city, job) person('Jack', 20, job='Engineer')#Jack 20 Beijing Engineer 注意:使用命名關鍵字參數時,要特別注意,若是沒有可變參數, 就必須加一個*做爲特殊分隔符。若是缺乏*, Python解釋器將沒法識別位置參數和命名關鍵字參數 參數組合: 在Python中定義函數,能夠用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數, 這5種參數均可以組合使用。可是請注意,參數定義的順序必須是: 必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。 對於任意函數,均可以經過相似func(*args, **kw)的形式調用它,不管它的參數是如何定義的。