day09-函數講解

1、如何定義一個函數

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('天下第一無敵帥') # 可以直接將字符串當作一個實參

2、函數返回值的介紹

  函數的返回值有三種情況,分別是無返回值、返回一個值和返回多個值。

  2.1、無返回值

    無返回值也即返回一個None。無返回值的情況也分為三種:

    1.函數中不寫return。

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

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

  2.2、返回一個值

    1.返回的一個值,可以是各種數據類型的,不論是列表、元祖還是什麼,都可以返回成功。

    2.只要返回,就能夠接受的到。

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

  2.3、返回多個值

    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)

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)

4、函數的註釋

  

1 函數的註釋
2 # def func():
3 #     '''
4 #     這個函數實現了什麼功能
5 #     參數1:有什麼作用    
6 #     參數2:有什麼作用
7 #     :return: 是字符串或者列表的長度
8 #     '''
9 #     pass

 

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *