說幾句:
函式呢,最後肯定是要有返回的:
如果沒有return語句,函式執行完畢後也會返回結果,只是結果為none。
如有有return none,可以簡寫為return。
這些就是有些函式只有乙個return,實際上是沒有實際意義的。
還可以返回多個值,其實會將多個值組裝成乙個tuple,tuple括號省略了而已,按照位置賦值給對應的值,所以python的返回多個值就是返回了tuple
常規引數:
沒啥可說的
可變引數:
def func(numbers):
sum = 0
for n in numbers:
sum = n * n
return sum
定義可變引數和定義乙個lsit或者tuple引數相比,僅僅在引數前面加了乙個號,在函式內部,引數numbers接收到的是乙個tuple,因此函式**完全不變,但是,呼叫函式的時候可以傳入任意個引數,包括0個引數
所以呢,func(1,2 ),func()都可以,那麼如果有乙個list1 = [1,2,3]怎麼呼叫呢?
func(list1[0],list1[1],list1[2])可以,但是如果100000個怎麼辦,那麼可變引數的威力就要顯現了,直接使用func(list1)即可搞定,函式定義時候的numbers會把list1這個列表中的所有元素作為可變引數傳進去,非常方便,美觀,實用,等等各種讚美的詞。。。。省略一萬個字
相比於可變引數組裝為tuple,關鍵字引數在函式內部自動組建為dict。
同時關鍵字引數可以如下使用方法:
def func(a,b,**kwargs):
pass
其中a,b是必選引數,還接受關鍵字引數kwargs,在呼叫函式時,可以只傳入必選函式,也可以傳入必選引數+關鍵字引數(0個,1個,或者多個)
func(a,b,c=「c_1」,d=「d_1」)
使用print語句就能看到,列印出來的是
同理,可變引數可以將乙個list傳進去,那麼關鍵字引數可以把乙個字典傳進去,如下:
extra =
func(a,b,city=extra[『city』],jcl =extra[『jcl』]) 比較麻煩
或者func(a,b,**extra)就啥都解決了
extra表示將dict的所有key-value用關鍵字引數傳入到函式的kwargs引數,kwargs獲得乙個字典,此時kwargs獲得的是字典的乙個拷貝,對kwargs的改動不會影響到函式外的extra。
此外python還支援這種
def func(x,y,z):
pass
func(z=10,x=5,y=6)
這種方式可以和其他方式混用,但是按順序傳遞的引數要位於關鍵字引數之前,而且不能存在復用的情況。
說了這麼多,關鍵字引數有啥用呢?可以拓展函式功能,比如註冊功能,你想拿到使用者名子和年齡,但是如果你傳了更多的內容,我也能收到。
函式引數混合使用:
1.普通函式+可變引數
func(a,b,*p),這種寫法a和b是普通引數
func(*p,a,b)這種引數寫法,實際呼叫的時候a和b是關鍵字引數
2.普通函式+可變引數+關鍵字引數
func(*p,a=100,b):
pass
a的預設值可以被覆蓋,可以忽略,b必須以關鍵字引數傳遞,*p正常傳就行
還有一種:命名關鍵字引數
之前介紹的關鍵字引數中,**kwargs中可以隨便傳,到函式內部需要判斷下某些key是否存在,但是有個問題就是,雖然函式內部有判斷,但是呼叫者呼叫函式到時候還是可以隨便傳一些內容上去,能不能只接受固定的關鍵字引數傳入呢?
答案是肯定的,那就是命名關鍵字引數,例如只想接收c和d作為關鍵字引數,那麼:
def func(a,b,*,c,d):
pass
和關鍵字引數不同,命名關鍵字引數一般需要乙個特殊的分隔符 * ,後面的引數被視為命名關鍵字引數,呼叫的時候可以為:
func(「a」,「b」,c=「c」,d=「d」)
如果函式定義中已經有了乙個可變引數,後面跟著的命名關鍵字引數就不再需要乙個特殊分隔符了,
但是如果沒有可變引數,*是絕對不能省略的
例如def func(a,b,*c,d,e):
pass
此時 呼叫的時候命名關鍵字引數必須有e=***和d=***,必須帶著c=,和d=,不帶這兩位,python直譯器會將傳進來的都當成普通的位置引數,但是位置引數只有2個,就會報錯;
但是有一種情況是可以省略的,請看下面:
def func(a,b,*c,d=「d」,e=「e」):
pass
這樣的定義的時候,就可以不傳e=***和d=***,因為有預設值;
終極應用,混合引數:
記住一點即可(命名關鍵字引數和關鍵字引數不能並用):
定義函式的時候引數的順序是必選引數,預設引數,可變引數,命名關鍵字引數或者關鍵字引數
匿名函式:
lambda表示式,可以賦值給變數,然後用變數來進行呼叫,主要用於不會復用的函式;
f = lambda x:x*x
f(5)
25基本結構就不說了,注意一點:lambda只能有乙個表示式,不用寫return,返回值就是該表示式的結果;
同時lambda可以作為函式的返回值,有點高階函式的味道了。
def func(x,y):
return lambda:xx+yy
幾個常用的函式:
print()
一般使用 print()函式時都只輸出了乙個變數,實際上 print()函式完全可以同時輸出多個變數 , 而且它具有更多豐富的功能 。
print()函式的詳細語法格式如下 :
print (value, … , sep=」 , end=』 \ n』, file=sys.stdout , flush=false)
sep:
使用 print()函式輸出多個變數時, print()函式預設以空格隔開多個變數,如果讀者希望改變預設的分隔符,可通過 sep 引數進行設定 。 例如輸出語句:
#同時輸出多個變數和字串,指定分隔符
print (」使用者名稱 : 」 , user_name, 」年齡 : 」, user_age, sep=』 | 』 )
end:
在預設情況下, print()函式輸出之後總會換行,這是因為 print()函式的 end 引數的預設值是「\n」,這個「\n」就代表了換行。如果希望 print()函式輸出之後不會換行,則重設end 引數即可 ,例如如下** 。
print(40,』\t』,end = 「」)
file
file引數指定 print()函式的輸出目標, file 引數的預設值為 sys.stdout,該預設值代表了系統標準輸出,也就是螢幕,因此 print()函式預設輸出到螢幕。實際上完全可以通過改變該引數讓 print() 函式輸出到特定檔案中 ,**如下:
f = open( "poem . txt」,「w」)#開啟檔案以便寫入
print ( 『鋤禾日當午 』, file=f)
print ( 』汗滴禾下土 』, file=f)
f. close ()
flush
print()函式的flush引數用於控制輸出快取,該引數一般保持為 false 即可,這樣可以獲得較好的效能。
isinstance()函式:引數型別檢查函式
isinstance(x,(int,float))
isinstance([1,2,3],(tuple,list))
isinstance(例項物件,類)
遞迴函式:
腦殼疼,容易溢位,需要尾遞迴優化(研究明白再更新)
C 筆記 函式 筆記
在標頭檔案中進行函式宣告 建議變數和函式應該在標頭檔案中宣告,在原始檔中定義。使用引用避免拷貝 如果函式無須改變引用形參的值,最好將其宣告為常量引用。比較兩個string物件的長度 bool isshorter const string s1,const string s2 表示陣列大小的形參voi...
筆記 內聯函式
內聯函式 示例1 include using namespace std inline int func int 定義乙個類的內聯函式 int func int x int main 示例2 include using namespace std class a private int x void...
Python筆記(函式)
函式就是將一些語句集中在一起的乙個部件,目的是減少我們同一段 的複製貼上,需要的時候以函式呼叫來代替,實現 的復用 函式定義語法 def 函式名 0個或多個引數 函式內要執行的 return 返回值 函式可以只定義函式名,沒有引數,也沒有返回值 defhello print hello world ...