-
函數
-
什么是函數:函數就是一個個小小的‘加工廠’(Function),對將要到來的‘原料’(參數變量)進行一系列邏輯、數學運算以及其他的一些循環語句的操作。簡單來說就是實現某中特殊作用和功能的載體。
-
為什么要用到函數:
-
-
-
許多相似的功能都能包裝在一個函數之中,多次實現其作用,大大減少了代碼的數量,並且提高了開發效率。
-
提高了程序的拓展性
-
-
-
如何去定義函數
-
def func(): # 其中函數名不得與關鍵字相同,而且函數名盡量做到見名知意 print('messi is the best football player') # 函數體代碼,定義階段不執行函數體代碼 func() # 調用階段 res = func() # 由於函數的優先級很高,所以在賦值階段就直接強行打印了func() print(res) # 變量接收返回值時,打印的是None,說明func()並沒有返回值
-
Attention!:調用階段時,函數名(func)遇到括號就會執行函數體代碼,並且其優先級最高,只有執行完函數后才能執行接下來的代碼。
- 要解決調用函數沒有返回值的問題,就必須用到return語句。
-
關鍵字return
-
分為以下幾種情況
-
- 寫return,返回的是None
-
def func(): l = ['messi','kobe','james'] while True: for i in l: if i == 'kobe': # 當i為kobe的時候 直接結束函數運行 # break return print('a6666666') # 這一行代碼擁有都不會運行 print(i) res = func() # 強行打印 print(res) # 返回None
2. 寫return,返回的是一個值(可以是任意的數據類型)
-
def func(): return 'messi' def func1(): return [10,24,23] def func2(): return {'name':'messi'} def func3(): return (10,) def func4(): return {10,24,23,44,56} def func5(): return True print(func(),func1(),func2(),func3(),func4(),func5())
3. 寫return,返回多個值
-
def func1(): return 'messi','kobe','james' res = func1() print(res) # 將多個數據以元組的形式返回值 >>>('messi', 'kobe', 'james')
為什么會以元組的形式返回值:函數並不希望自己的數據被修改
4. 為了將數據返回成我們想要的數據類型,可以在return后面輸入想要的數據類型格式
-
def func1(): return {'messi','kobe','james'} res = func1() print(res) # 將多個數據以集合的形式返回值 >>> {'james', 'messi', 'kobe'}
同理 如果是想要輸出列表類型,就可以在字符串兩邊加上中括號的格式。
-
總結:(1)、並不是說只有在寫了return的情況下,函數才擁有了返回值,而是不管在任何情況下函數都擁有返回值,只不過在沒寫return 的情況下,函數的返回值默認為None。
(2)、光寫return的意義在於結束整個函數的運行,而不是返回值
-
參數
-
主體分為形參和實參,其中形參是函數在定義過程中,在括號中寫的變量名,全稱形式參數;而實參是函數在調用過程中,函數括號內的賦予變量名的值,全稱實際參數。兩者只在函數調用和定義過程中有着密不可分的練習,離開函數之后並無太大意義。簡單來說調用函數就是利用實參來傳給形參賦值執行函數體語句的過程。
-
格式:
-
函數的簡易結構 def 函數名(形參1,形參2...): '''函數的注釋 用來描述該函數的作用以及各個形參的類型''' 函數體代碼1 函數體代碼2 ... return 函數的返回值
-
def func(args): # 定義函數,命名形參 print(args) # 函數體語句 n = 0 for i in args: n += 1 return n print(func('messi')) # 給形參賦予實參的'messi'的值,執行函數體語句操作
-
其中形參又可以有很多形式的形參比如位置形參,默認形參,可變長形參等
-
位置形參
-
定義:在函數定義時,在括號中從左向右寫的形參,並且在實參賦值時遵循着“先到先得”的原則,第一個實參就賦值於第一個位置形參,第二個實參就賦值於第二個位置形參。。。依次類推,並且賦值的實參個數必須與形參個數一致,否則會報錯。
-
def func1(x,y): # 定義函數和形式參數的命名 if x > y: return x else: return y print(func1(10,20)) # 其中10為第一個參數所以其為x賦值,20為第二個實參則它為y賦值,從而輸出為20
除了這種方法給位置參數賦值,還有一個方法給其賦值,那就是關鍵詞傳參,如下所示:
-
def func1(x,y,z): # 定義函數和形式參數的命名 if x > y and x > z: return x elif y > z: return y else: return z print(func1(10,80,z = 30)) # 關鍵字傳參和位置傳參一起用
print(func1(20,z = 90,x = 30)) # 其中第一個20傳參給x,而后面30又傳參給x,則報錯不能對同一個參數傳參兩次
print(func1(20,z = 100 , y = 60)) # 關鍵字傳參可以不按順序,但一定不要對同一個形參賦兩次值還有一個值得注意的是,位置參數必須放在關鍵詞傳參之前。
-
默認值參數
-
顧名思義,默認值參數的意思就是在函數定義過程中,形參已經被默認值給賦值了。因此在函數調用時,就不必為其賦值了,自然會調用默認值。如果調用參數時,不想使用默認值,只需要修改調用函數的實參來更換,實參取的什么,調用函數就傳什么參數給形參。
-
def register(playername,age,gender='male'): # 形式參數必須排列在默認值參數之前 print(playername,age,gender) register('messi',31) register('kobe',43) register('james',32) register('lina',40,gender = 'female') # 如果函數調用的時候,實參與默認值參數不同,那么所傳的參數就是實參所指定的值,不傳默認值參數
還有一個要注意的點就是:函數形參中用到的值都是往定義階段往上找就行了
-
可變長參數(*和**的使用)
- 一方面是因為傳參是實參的參數個數不固定,超出了形參的參數個數范圍,用來接收溢出的位置參數和關鍵字參數。
- 一方面是因為實參參數的格式會出現列表,字典,元組等數據類型,從而將他們用類型於for循環的方法一個個拆分。
-
*和**站在形參的角度來說,更像是將實參中冗余的數據做成一個大的容器類型的數據來賦值輸出;站在實參的角度來說,更像是將賦值於形參的數據一個一個拆分成小的位置參數和關鍵字參數來調用。對於形參是揉和成團,而對於實參則是大卸八塊。而且*是針對位置參數,**是針對關鍵字參數
-
站在形參上使用*
-
def func2(x,y,*z): # 形參來接收溢出的實參數據 print(x,y,z) func2('messi','agentina','barcelona','football','40') # 將從第三個參數之后的一起合在一起成為元組,賦值於形參
-
站在實參上使用*
-
def func2(x,y,z): print(x,y,z) func2(*['messi','agentina','barcelona']) # 將實參中的容器類型,按照類似for循環的方式拆分為可以賦值於形參的數據類型
-
站在形參上使用**
-
def func3(x,y,**z): # 將實參中溢出的關鍵字參數按照字典存放來進行賦值 return (x,y,z) res = func3(x = 'messi',y = 'agentina',z = 'barcelona',a = '40',b = 'football') print(res)
-
站在實參上使用**
-
def func3(x,y,z): print(x,y,z) res = {'x' : 'messi','y' : 'agentina','z' : 'barcelona'} func3(**res) # 將實參中的容器類型按照for循環的方式拆分成關鍵字參數傳參
