Python學習筆記三
參考教程:廖雪峰官網https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
一、函數的定義
Python中定義一個函數需要使用def語句,依次確定函數名、參數及函數體內容:
#一個求絕對值的函數 def my_abs(x): if x>0: return x else: return -x
如果函數體內沒有return語句,也會返回None。return None可以簡寫為return。
如果要定義一個什麽都不做的函數(空函數),可以用pass語句,pass也可以用在if語句中:
def nop(): pass def nopx(n): if n>0: pass else: return
*返回多個值的函數
#給出長方形的長和寬,輸出面積和周長 def sqcount(l,w): area=l*w length=2*(l+w) return area,length
可以增加一些語句看看這個返回的到底是什麽:
x,y=sqcount(3,4) print(x,y) #這裏輸出12,14 r=sqcount(5,6) print(r) #這裏輸出(30,22)
從上述代碼可以看出,雖然看起來函數返回了多個值,其實本質還是返回了一個值,只是這個值的類型是元組!
二、函數的參數
(一)位置參數
前面定義的my_abs()以及sqcount()中的參數都是位置參數,它是調用函數時必須傳入的參數,並且按照定義時的位置順序傳遞給對應參數。
(二)默認參數
有一些情況,參數中有部分參數在多數情況下都是某一個值,這時候可以在定義函數的時候將其固定設置下來,在調用時候如果該參數值和定義時對應的參數值相同則可以不寫出,在不相同時候則需要寫出具體值代入函數。
#默認情況下,國籍設置為china def person_info(name,age,country=‘china‘): print(‘name=‘,name,‘age=‘,age,‘country=‘,country) return True #ZhangHua國籍為china則可以不傳入國籍參數 person_info(‘ZhangHua‘,26) #Tom國籍為美國,則需要設置 person_info(‘Tom‘,29,‘America‘)
需要註意的是,當有多個默認參數時,在調用的時候可以按照順序提供默認參數,也可以加上參數名以指定默認參數之間的對應關系。
def enroll(name, gender, age=6, city=‘Beijing‘): print(‘name:‘, name) print(‘gender:‘, gender) print(‘age:‘, age) print(‘city:‘, city) #年齡信息參數的傳入是按照定義時候的第三的順序 #所以可以不加參數名 enroll(‘Bob‘, ‘M‘, 7) #這裏年齡使用了定義時的默認值,所以不寫出 #但需要設置城市,而位置關系又和定義時候不一致 #所以需要寫上‘city=‘ enroll(‘Adam‘, ‘M‘, city=‘Tianjin‘)
關於默認參數還必須註意一點,如:
#定義時候使用了默認參數L,指向一個空列表 def testa(L=[]): L.append(‘END‘) return L print(testa()) #輸出[‘END‘] print(testa()) #輸出[‘END‘,‘END‘]
兩次同樣的調用,為什麽輸出不一樣呢?在定義的時候默認參數L的值就被計算了,即指向[],L也是一個變量,在每次調用時如果改變了L的內容(指向),默認參數自然就隨之而變了。所以:默認參數必須指向不可變對象!
可以通過None修改上面的代碼:
def testa(L=None): if L is None: L=[] L.append(‘END‘) return L
(三)可變參數
可變參數是指傳入的參數數量是可以變化的,任意個的。設計這種參數的情況就是在函數定義的時候不知道調用時會有多少個參數,比如:列表、元組等等。那麽就可以將參數整體設置為一個列表或者元組等等,而Python對於變量是不需要指定類型的,所以簡單的做法如下:
def calc(numbers): sum=0 for i in numbers: sum=sum+i return sum
但上述這種定義的方法必須傳遞類型為可叠代類型的數據,如列表等,如傳遞其他類型比如數值類型的會報TypeError: ‘int‘ object is not iterable的錯誤。
#正常運行,輸出6 x=[1,2,3] print(calc(x)) #報錯:參數非叠代類型 y=2 print(calc(y))
對於上面定義的函數,也可以直接傳入值:
print(calc([1,2,3])) print(calc((2,3,5,7,11))
這樣在使用的時候其實並不夠方便,因為需要先組裝成一個列表或元組才可以使用,如果想用如下的方式調用可必須用到可變參數的方法:
cal(1,3,5,7,9,11)
可以在定義時把參數變為可變參數:在參數前面加’*‘:
def calc(*numbers): sum=0 for i in numbers: sum=sum+i return sum
這樣就可以直接通過cal(1,3,5,7,9,11)調用,而如果是一個列表或元組的話,在傳參時只需要在列表或元組名前加‘*‘作為參數也可以方便調用:
print(calc(1,3,5,7,9,11)) x=[1,2,3] print(calc(*x)) y=(2,3,5,7) print(calc(*y))
不管參數在傳遞前是什麽類型,是直接的數值傳遞還是列表或元組,但傳入函數後,函數內部都是將這些可變參數組裝成一個元組來操作。
(四)關鍵字參數
關鍵字參數允許傳入任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝成一個字典(dict):
#前兩個參數為位置參數,代表姓名和年齡信息 #第三個參數則定義了可選的關鍵字參數,可以讓調用者提供其他信息 def person(name,age,**kw): print(name,‘-‘,age,‘-‘,kw)
#調用者可以只提供必選的位置參數信息
#輸出:LiNa - 32 - {}
person(‘LiNa‘,32)
#調用者提供一個信息:國家
#輸出: Jenny - 35 - {‘country‘: ‘British‘}
person(‘Jenny‘,35,country=‘British‘)
#調用者提供兩個信息:國家和性別
#輸出:Tom - 39 - {‘gender‘: ‘M‘, ‘country‘: ‘Holland‘}
person(‘Tom‘,39,gender=‘M‘,country="Holland")
如果已有一個dict,那可以直接在字典名前加‘**‘,將其作為關鍵字參數傳遞:
#輸出:LiNa - 32 - {‘coutry‘: ‘China‘, ‘gender‘: ‘F‘, ‘food‘: ‘Reganmian‘} lina_info={‘coutry‘:‘China‘,‘gender‘:‘F‘,‘food‘:‘Reganmian‘} person(‘LiNa‘,32,**lina_info)
(五)命名關鍵字參數
在關鍵字參數中,調用者可以自行設置傳遞到關鍵字參數的參數名,如上述的country,gender和food都是可選並且可自行設置的,如果要限制關鍵字參數的名字,就需要用到命名關鍵字參數:
#關鍵字參數只接受名字為city和job def person(name,age,*,city,job): print(name,‘-‘,age,‘-‘,city,‘-‘,job) #這裏將會報錯,因為沒有傳遞job參數 person(‘mengfei‘,50,city=‘Nanjing‘) #正常運行,輸出:wanggang - 60 - Beijing - Actor person(‘wanggang‘,60,city=‘Beijing‘,job=‘Actor‘)
命名關鍵字參數可以有默認值,這樣的話在調用時候該參數可以不顯式指定:
def person(name,age,*,city=‘Beijing‘,job): print(name,‘-‘,age,‘-‘,city,‘-‘,job) #輸出:wanggang - 60 - Beijing - Actor person(‘wanggang‘,60,job=‘Actor‘)
當函數參數列表中有可變參數時,後面跟著的命名關鍵字參數就不再需要一個特殊符號‘*‘了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
#a,b為位置參數是必選的 #c是可選的默認參數 #args是可選的可變參數 #kw是可選的關鍵字參數 def f1(a,b,c=0,*args,**kw): print(‘a=‘,a,‘b=‘,b,‘c=‘,c,‘args=‘,args,‘kw=‘,kw) #函數調用時,解釋器自動按照參數位置和參數名進行傳遞 #只有兩個位置參數,默認c為0 #輸出:a= 1 b= 2 c= 0 args= () kw= {} f1(1,2) #位置參數加自定義的默認參數值 #輸出:a= 1 b= 2 c= 3 args= () kw= {} f1(1,2,c=3) #位置參數+默認參數+可變參數 #如果有關鍵字參數則需要加命名 #輸出:a= 1 b= 2 c= 3 args= (‘a‘, ‘b‘) kw= {} f1(1,2,3,‘a‘,‘b‘) #輸出:a= 1 b= 2 c= 3 args= (‘a‘, ‘b‘) kw= {‘x‘: 99} f1(1,2,3,‘a‘,‘b‘,x=99)
Python學習筆記三