函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
定義一個函數:
def 函數名(參數列表):
函數體
#定義一個沒有參數,沒有函數體實現的函數;pass相當于占位符,使定義函數滿足語法要求,或者是先定義一個函數名,后面再實現其功能
def func():
pass
#定義一個add函數,參數為a,b,返回a+b的結果:
def add(a,b):
return a+b
print(add(1,2))
3
return函數最終返回的內容,如果沒有寫return,則默認返回None,相當于return None
函數不一定要顯式返回,具體要看函數的功能
函數分為內置的函數和自定義的函數兩種
函數的作用:
1.封裝,別人無須知道實現的細節
2.修改的時候,一處修改,全局生效
3.使用的時候方便,調用函數就可以了
什么時候會用到函數?
策略:
當你寫了大段大段的相同或者類似地代碼段后,就需要嘗試去封裝為函數。
如何寫一個函數:
1.傳參的類型判斷,不符合計算規則的參數需要忽略或者其他處理。
2.思考需要聲明哪些變量來存儲計算結果和中間的計算過程值。
3.開始寫的時候,最好加上中間狀態的打印語句。一般用的邏輯是遍歷+if判斷+return短路等。
4.計算完畢,想清楚返回1個還是多個數據的結果。
函數的參數
可變長參數(參數數量不固定)
*arg:表示把可變的多個非命名參數,轉換為了一個元組
**kw:表示把可變的多個命名參數,轉換為了一個字典
例:
def add(a,*arg):
result = a
for num in arg:
result += num
return result
print(add(1,2,3,4))
10
def print_sth(a,**kw):
print(a)
for k,v in kw.items():
print(k,v)
print_sth(1,b=2,c=3)
*arg和**kw可以混合使用
def func(a,b,*arg,**kw):
result = a * b
for i in arg:
result *= i
for j in kw.values():
result *= j
return result
print(func(1,2,3,4,f=5)) #等價于1*2*3*4*5
函數傳入的參數為不可變的,對外部的變量就沒影響。
按值傳–傳入的不是變量對應的內存地址。
函數傳入的參數為可變的,對外部的變量就有影響。
按引用傳–傳入的是變量對應的內存地址。
注:
不可變對象:所有的數字、字符串、元組
可變:set dict list 實例
參數傳不可變對象的時候,函數內外變量值是獨立的
參數傳可變對象的時候,函數內外變量值是關聯的
原則1:
如果你傳入的參數是個變量a,這個變量是可變類型(list、dict、set)
那么函數內部對于這個參數的所有操作結果都會影響外部的參數值
原則2:
如果你傳入的參數是個變量a,這個變量是不可變類型(字符串、整數、小數)
那么函數內部對于這個參數的所有操作結果不會影響外部的參數值
函數和方法
函數:不寫在類里面
方法:寫在類里面的
實例或類里的叫方法
不在實例或類里的叫函數
幾種方法的區別
類方法、實例方法、靜態方法
類方法可以被類對象或實例調用,實例方法只能被實例調用,它只屬于類的單個實例擁有,靜態方法兩者都能調用,它在類和實例間共享。Python實現了一定的靈活性使得類方法和靜態方法,都能夠被實例和類二者調用。
所以三者主要區別在于參數傳遞上的區別,實例方法隱含傳的參數是類實例self,而類方法隱含傳遞的參數是類本身cls,而靜態方法無隱含參數,主要為了類實例也可以直接調用靜態方法(方法的參數將在類/面向對象部分講到,此處不做擴展)
Python類中隱藏數據
類中的方法名前后都有兩個下劃線,表示是Python的內置方法,如__init__()
類中的方法名前面有兩個下劃線,表示是Python中的私有方法,類似于java中的private,不能在類外部調用(如__setId()).
類中的屬性前有兩個下劃線表示聲明該屬性為私有屬性,不能在類的外部被使用或直接訪問,如__name
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
