【Python基礎入門系列】第05天:Python函數

        前面我們寫過九九乘法表,但如果我要七七乘法表或五五乘法表的話,你會看到三者代碼極其類似,只是循環變量不同,那麼如何做到代碼重用,而不是簡單拷貝黏貼修改呢,其實可是使用函數完成這一功能!

先來試着看一看這個函數:

def table(row,col,sep=3):
   for i in range(1, row + 1):
       for j in range(1, col + 1):
           if j <= i:
               print("%d*%d = %2d" % (i, j, i * j), end='%*s'%(sep,' '))
       print('')
#一次編碼,到處運行
table(8,8)
table(5,5,8)

 

下面就來介紹一下今天的內容--》python函數

 

1.函數定義

函數就是完成特定功能的代碼塊,本質上是對代碼的封裝

語法格式:

def 函數名([參數1],[參數2]....[參數n]):
函數體
  • 函數名命名規則同變量名,要滿足標識符命名規則

  • 不能和系統函數重名,否則系統函數無法使用

  • 函數定義分兩部分函數頭和函數體

  • 函數體,就是實現功能的代碼段,以:開頭,必須縮進

  • 函數名的命名風格:一般建議用下劃線分隔的小寫單詞組成:say_hello

     

函數的優點:

  • 代碼可複用

  • 代碼可維護性高

  • 容易排錯

  • 可讀性好

  • 利於團隊開發

 

 

2 函數參數

2.1 實參和形參

  • 形參:就是函數定義時小括號裏的變量

  • 實參:函數調用的時候,小括號裏的表達式

  • 函數可以沒有形參和實參

2.2 參數分類

  • 位置參數,要求實參順序必須和形參順序完全一致,由形參順序決定實參順序

    def say_hello(name,age,home):
           print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home))
    
    say_hello('王二妮',18,'湖北武漢') #實參個數、順序必須和形參一致

     

  • 關鍵字參數,函數調用時,實參可以是鍵值對,鍵就是形參名字,這樣的調用,實參不必關心形參的順序。

    def say_hello(name,age,home):
           print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home))
    
    say_hello(name='王二傻',home='大連',age=20) #三個關鍵字參數
    say_hello('大傻',home='美國',age=30) #兩個關鍵字參數
    sya_hello('二傻',24,home='何方')   #一個關鍵字參數

     

  • 默認值,如果形參在定義的時候給定一個值,那麼函數在調用時就可以不傳實參,可以簡化調用

    def my_power(x,n=2):
            return (x) ** n
    my_power(3)
    my_power(4,0.5)
    
    def test(a=[]):
           a.append('end')
           print(a)
    test([1,2,3])
    test()   #['end']
    test()   #['end','end']
    • 默認值參數必須放到最右邊

    • 如果傳了實參,那麼實參優先,不會使用默認值

    • 默認值只計算一次

    • 默認值必須是不可變對象

  • 可變參數,傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。

    #使用*接收任意數量的位置參數
    #注意:*的不定長參數被當做元組處理
    
    def demo(a,b,*args):
           print(a,b,args)
    
    demo(12,33,90)
    demo(1,2,3,4,5)
    a=(1,2,3)
    demo(*a)
    
    #使用**接收任意數量的關鍵字參數
    #注意:**的不定長參數被當做字典處理
    def demo1(a,**args):
           print(a,args)
    demo1(1,name='kk',age=3)
    b = {'a':20,'b':12,'c':32}
    demo(**b)

     

2.3 參數組合

  • 形參順序須按照以下順序:位置參數、默認值參數、*args,**kwargs

3 函數調用

  • 函數調用必須在函數定義之後

  • 函數調用必須能夠正確傳遞實參

    
    def demo(a,b,c=0,*arg1,**arg2):
            print(a,b,c,arg1,arg2)
    demo(1,3,k=4)
    demo(1,2,3,4,5)
    demo(1,b=3,c=3,d=5)
    demo(*(1,2,3),**{'name':12}) #任何函數都可通過這種形式傳遞參數

     

4 返回值

可以通過return語句返回計算結果。

  • return的作用一個是終止函數的執行,所有執行了return後,其後的語句不會被執行

  • 如果沒有return語句,則默認返回的是None

  • return還可以返回給調用者數值

  • return可以返回一個值,如果要返回多個值,那麼返回的是一個元組

     

    語法:

    def demo2():
           return 1
    def demo3():
           return 1,2,3
    print(demo2())
    print(demo3()) #(1,2,3)

     

5 文檔字符串

函數文檔字符串documentation string (docstring)是在函數開頭,用來解釋其接口的字符串。簡而言之:幫助文檔

  • 包含函數的基礎信息

  • 包含函數的功能簡介

  • 包含每個形參的類型,使用等信息

文檔字符串書寫規則:

  • 必須在函數的首行

  • 使用三引號註解的多行字符串(''' ''') 或(""" """)

  • 函數文檔的第一行一般概述函數的主要功能,第二行空,第三行詳細描述。

    def test():
       """
          函數名:test
          功能:測試
          參數:無
          返回值:無
      """
          print("函數輸出成功")
    
    #使用__doc__屬性查看文檔字符串
    print(test.__doc__)

     

6.參數傳遞

python的參數傳遞是簡單的值傳遞,當然這裏的值是指變量的引用(地址),不是變量的值。不存在值傳遞和引用傳遞的區分。簡而言之,python的參數傳遞可以稱之爲對象引用傳遞,對象可以分爲:

  • 不可變對象:int、float、None、complex、bool、tuple、str,range

    • 在函數內部不可能修改函數外部的變量

  • 可變對象: dict、list

    • 可以在函數內部修改

7 空函數

藉助於pass語句實現,函數體不完成任何功能,只有一個pass語句

def test():
  pass

8 匿名函數

不再使用def 函數名()這種形式定義函數,而是使用lambda來創建匿名函數

特點:

  • lambda只是一個表達式,函數體比def簡單的多

  • lambda的函數體不再是代碼塊

  • lambda只有一行,增加運行效率

語法:

lambda [arg1,arg2....argn]:函數體
add = lambda a,b:a + b
print(add(3,5))

9.函數類型

函數也是一種類型,我們自定義的函數就是函數對象,函數名保存了函數對象的引用(地址)

def test():
  print('我是測試函數')

print(test) #函數名是變量,指向了函數對象
pf = test   #pf變量也指向了函數對象,所以也可以通過pf調用test函數
pf()

10.傳入函數

一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數,也可以稱之爲傳入函數。可以實現通用編程,排序等複雜功能

 

總結

本節給大家介紹了 Python  函數的使用,對於初步瞭解的同學可能不大友好,還需要自己把不明白的地方多看多查資料深入瞭解。

參考:

https://www.runoob.com/python/python-functions.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017105145133280

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章