day09-函數講解

一、如何定義一個函數

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

  2.一、無返回值

    無返回值也即返回一個None。無返回值的狀況也分爲三種:code

    1.函數中不寫return。blog

    2.只寫一個return。只寫一個return表明結束一個函數。若語句執行到return,則跳出這個函數。字符串

    3.return None。這種方式不經常使用。class

  2.二、返回一個值

    1.返回的一個值,能夠是各類數據類型的,不管是列表、元祖仍是什麼,均可以返回成功。變量

    2.只要返回,就可以接受的到。數據類型

    3.若是一個函數中有多個return,那麼只會執行第一個return,後面的return都不會執行。數據

  2.三、返回多個值

    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
相關文章
相關標籤/搜索