1 s = '華爲加油a' 2 def s_len(): 3 i = 0 4 for k in s: 5 i += 1 6 print(i) 7 s_len()
這個函數的功能就是輸出字符串的長度。可是他只能輸出特定字符串的長度,因此咱們換一種寫法:函數
1 k = '華爲加油a' 2 def s_len(s): 3 i = 0 4 for k in s: 5 i += 1 6 print(i) 7 return i # 使函數有返回值 8 s_len(k) 9 s_len('天下第一無敵帥') # 能夠直接將字符串看成一個實參
函數的返回值有三種狀況,分別是無返回值、返回一個值和返回多個值。spa
無返回值也即返回一個None。無返回值的狀況也分爲三種:code
1.函數中不寫return。blog
2.只寫一個return。只寫一個return表明結束一個函數。若語句執行到return,則跳出這個函數。字符串
3.return None。這種方式不經常使用。class
1.返回的一個值,能夠是各類數據類型的,不管是列表、元祖仍是什麼,均可以返回成功。變量
2.只要返回,就可以接受的到。數據類型
3.若是一個函數中有多個return,那麼只會執行第一個return,後面的return都不會執行。數據
1.用多個變量接收,有多少個返回值就用多少個變量去接收註釋
1 def return_more(): 2 return 1,2,3 3 a,b,c = return_more() 4 print(a,b,c)
2.能夠用一個變量去接收全部的變量,獲得的是一個元祖
1 def return_more(): 2 return 1,2,3 3 result = return_more() 4 print(result) 5 # result: (1,2,3)
函數的參數能夠沒有,能夠有一個,能夠有多個。
傳參時,也有一些細節須要注意:
1.按照位置傳參
1 def deliver(a,b): 2 print(a,b) 3 deliver(1,2)
2.按照關鍵字傳參
1 def deliver(a,b): 2 print(a,b) 3 deliver(b = 1,a = 2)
3.混合傳參。混合傳參必須先按照位置傳參,而後才能夠按照關鍵字傳參。
1 def deliver(a,b): 2 print(a,b) 3 deliver(1,b = 2)
如下幾種是錯誤的。
#1 def deliver(a,b): print(a,b) deliver(1,a = 2) #不能兩個都是a #2 def deliver(a,b): print(a,b) deliver(a = 1,2)
4.默認參數。對於默認參數,不傳參的話就會用默認的參數,傳了的話,就會用傳過的。
1 def classmates(name,sex = '男'):#設置默認值 2 print('%s:%s'%(name,sex)) 3 classmates('張三')
在這裏,sex默認爲男,沒有傳參時,輸出的內容就是默認的男。
5.若想要定義默認參數,必須先定義位置參數,才能定義默認參數。
1 def classmates(sex = '男',name):#設置默認值 2 print('%s:%s'%(name,sex)) 3 classmates('張三')
上面的這種方式就會報錯,爲何呢?這是由於你這裏的張三,電腦根本不知道他究竟是sex的仍是name的。
6.動態參數
(1)*args---接收的是按位置傳參的值,組成一個元祖
通常來講,咱們想要計算兩個數之和,咱們會定義a+b,那麼咱們想要計算n個數之和,咱們該怎麼辦呢?這裏咱們就用到了動態參數。
1 def sum(*args): 2 print(args) 3 sum(1,2) 4 sum(1,2,3) 5 sum(1,2,3,4) 6 # result: 7 # (1, 2) 8 # (1, 2, 3) 9 # (1, 2, 3, 4)
在上面代碼中,咱們能夠看到,不論調用函數是,實參有多少個,結果都能打印出來,且結果是一個元祖。同時定義函數時,形參必須加星號,至於爲何要用args,是由於它是一種習慣用法,你也能夠用其餘的變量名,但一般來講,都是用args,方便別人理解。
1 def sum(*args): 2 Sum = 0 3 for i in args: 4 Sum += i 5 print(Sum) 6 sum(1,2) 7 sum(1,2,3) 8 sum(1,2,3,4) 9 # result: 10 # 3 11 # 6 12 # 10
(2)**kwargs---接收的是按關鍵字傳參的值,組成一個字典
1 def func(**kwargs): 2 print(kwargs) 3 func(a = 1,b = 2) 4 func(a = 1,b = 2,c = 3) 5 func(a = 1,b = 2,c = 3,d = 4) 6 # result: 7 # {'a': 1, 'b': 2} 8 # {'a': 1, 'b': 2, 'c': 3} 9 # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
(3)將(1)(2)混合,注意必須先定義位置動態參數,再定義關鍵字動態參數。
1 def func(*args,**kwargs): 2 print(args,kwargs) 3 func(1,2,a = 3,b = 4) 4 # result:(1, 2) {'a': 3, 'b': 4}
(4)細節講解
def put(*args): print(args) put(1,2,3,4) # 上面結果爲:(1,2,3,4),可是若是換成下面的形式會輸出什麼呢? def put(*args): print(*args) put(1,2,3,4) # 結果是:1 2 3 4,很明顯,第一種的結果是一個元祖,而第二種的結果一個個被打散了的數。那麼爲何可以這樣使用呢? # 能夠看下面的代碼: print(*[1,2,3,4],*(1,2,3,4)) # 他們的結果都是:1 2 3 4。從結果可知,不管是元祖仍是列表,在前面加上星號,都會使之成爲一個個的數。而在上面第二段代碼中,也是一樣道理,輸出args時,是一個元祖,輸出*args,也就至關於在元祖前面加上星號。
7.在第五點中,若要定義默認參數,但同時還有位置參數時,它們之間有個順序。若同時還有動態參數時,他們的順序又是什麼呢?
他們的順序分別是:位置參數、*agrs、默認參數、**kwargs。
爲何默認參數在**kwargs前面呢,仔細想想,假設**kwargs在默認參數前面,那麼第一個關鍵字確定是給了**kwargs了,默認參數接收的不知道是哪個,因此默認參數必須在**kwargs前面,這樣默認參數才能接收到他的值。
8.動態參數的另外一種傳參方式
假設有一個序列l = [1,2,3,4],我要分別將其中的內容打印出來,能夠這樣作:
1 def func(*args): 2 print(args) 3 l = [1,2,3,4] 4 func(l[0],l[1],l[2],l[3])
可是,若是這個序列中有不少元素,那豈不是很累,因此如今咱們能夠這樣作:
1 def func(*args):#站在形參的角度上,給變量加上*,就是組合全部傳來的值 2 print(args) 3 l = [1,2,3,4] 4 func(*l)#站在實參的角度上,就是將這個序列打散 5 #result:(1, 2, 3, 4)
同理,對於**kwargs,咱們也能夠這樣作:
1 def func(**kwargs): 2 print(kwargs) 3 d = {'a':1,'b':2} 4 func(**d)
1 函數的註釋 2 # def func(): 3 # ''' 4 # 這個函數實現了什麼功能 5 # 參數1:有什麼做用 6 # 參數2:有什麼做用 7 # :return: 是字符串或者列表的長度 8 # ''' 9 # pass