JCLpython筆記 函式

2021-10-04 10:38:14 字數 3890 閱讀 9299

說幾句:

函式呢,最後肯定是要有返回的:

如果沒有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 ...