1. 程式人生 > >Python基礎-函式(六)

Python基礎-函式(六)

一、函式介紹

  函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。

  函式能提高應用的模組性,和程式碼的重複利用率。Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式

  如果在開發程式時,需要某塊程式碼多次,但是為了提高編寫的效率以及程式碼的重用,所以把具有獨立功能的程式碼塊組織為一個小模組,這就是函式。

二、定義函式

  定義函式:

    1、函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。

    2、任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。

    3、函式的第一行語句可以選擇性地使用文件字串:用於存放函式說明。

    4、函式內容以冒號起始,並且縮排。

    5、return [表示式] 結束函式,不帶表示式的return相當於返回 None。

  函式名的命名規則:

    1、推薦使用英文,可以使用中文(不建議用)

    2、數字不能開頭,可以使用數字

    3、不可以使用特殊字元,除下劃線

    4、函式名區分大小寫

    5、不能和系統關鍵字重名

三、語法

  def 函式名(引數列表):

    函式體

  示例1(不帶引數):   

#宣告無引數函式
def print_Hello():
    #函式說明
    """這是函式說明,該函式列印hello word
""" print("hello word") #函式呼叫 print_Hello()
View Code

  示例2(帶引數):

#宣告有引數函式
def print_Hello(strs,strss):
    #函式說明
    """這是函式說明,該函式列印hello word和123"""
    print(strs)
    print(strss)
#函式呼叫
print_Hello("hello word","123")
'''註釋:
形參:形式上的引數,宣告函式時,括號()中的引數,是形參。
實參:實際上的引數,呼叫函式是,括號()中的引數,是實參。
實參將值傳遞給形參的本質過程,本質上就是簡單的變數賦值。
呼叫的時候,這個函式定義時有幾個引數,就需要傳遞幾個引數
預設情況下,引數值和引數名稱是按函式宣告中定義的的順序匹配起來的。
'''
View Code

  示例3(帶關鍵字引數):函式名(形參1=實參1,形參2=實參2。。。)

#宣告有引數函式
def print_Hello(strs=0,strss=0):
    #函式說明
    """這是函式說明,該函式列印hello word和123"""
    print(strs)
    print(strss)
#函式呼叫
print_Hello(strss="123",strs="hello word")
'''註釋:
形參:形式上的引數,宣告函式時,括號()中的引數,是形參。
實參:實際上的引數,呼叫函式是,括號()中的引數,是實參。
實參將值傳遞給形參的本質過程,本質上就是簡單的變數賦值。
呼叫的時候,這個函式定義時有幾個引數,就需要傳遞幾個引數
預設情況下,引數值和引數名稱是按函式宣告中定義的的順序匹配起來的。
關鍵字引數就是呼叫函式時,在實參前面指定形參的做法,為了防止引數按照位置傳遞出現的錯誤。
'''
View Code

四、函式的引數傳遞

  不可變型別:整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。

  可變型別:列表、字典。如fun(a),則是將a真正的傳遞過去,修改後fun外部的a也會受影響。

  傳遞不可變型別引數:

    

  傳遞可變型別引數:

    

五、函式的引數

  分類:必須引數、關鍵字引數、預設引數、可變引數  

  1、必須引數

    從字面理解:必須要傳入引數

    傳入的引數:與定義的形參順序一一對應

  2、關鍵字引數

    引數位置匹配,關鍵字引數,與形參的位置順序無關

  3、預設引數:   

    預設引數必須指向不變的物件

    當函式有多個引數,把變化大的引數放在前面,變化小的引數放在後面。變化小的引數就作為預設引數。

    預設引數好處:降低呼叫函式的難度

  4、可變引數(*args,**kwargs):

    *args  **args

    用途:在定義函式需要,每個定義函式功能的都可以繼續優化,所以我們需要用動態引數

    如果把引數寫死了,後期繼續修改完善的功能的,修改該函式功能則會相當麻煩

    *args  結果型別是元祖,傳遞值是任意型別

    **kwargs結果型別是字典,傳遞值是以key=value方式傳入

  5、函式引數總結:

    1.形參的位置順序,必須與實參的順序一一對應,缺一不行,多一不行

    2.關鍵字引數,無須一一對應,缺一不行,多一不行

    3.位置引數必須在關鍵字引數左邊

    4.預設引數一定要用不可變物件,如果是可變物件,程式執行時會有邏輯錯誤。

六、函式巢狀

  簡單來說:就是在函式內部呼叫其它函式

  示例:

def print_one():
    print("第一個函式")
    print_two()
def print_two():
    print("第二個函式")
print_one()

 七、全域性變數和區域性變數

   在子程式中定義的變數稱為區域性變數,只在子程式內部生效

  在程式一開始定義的變數稱為全域性變數

  

 

  注意:

    1、全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。

      2、當全域性變數與區域性變數同名時:在定義區域性變數的子程式內,區域性變數起作用,在其他地方全域性變數起作用

    3、如果全域性變數是可變的資料型別,函式可以對全域性變數內部直接進行修改

    4、函式優先讀取區域性變數,能讀全域性變數,無法對全域性變數重新賦值操作

    5、變數的查詢順序  從裡向外查詢:

        作用域區域性>外層作用域>當前模組中的全域性>python內建作用域;

八、globalnonlocal

  1、global

    定義:使用global定義全域性變數  

names = ['李四']
def print_name(ages):
    global names
    names = ages
    print(names)#列印王二

print_name('王二')
print(names)#列印王二

  2、nonlocal

    定義:nonlocal關鍵字使用外層(非全域性)變數。

 1 names = ['李四']
 2 def print_name(ages):
 3     names = ages
 4     print(names)#列印 王二
 5     def print_name1():
 6         nonlocal names
 7         names = '麻子'
 8         print(names)#列印 麻子
 9     print_name1()
10     print(names)#列印王二
11 
12 print_name('王二')
13 print(names)#列印 ['李四']

九、遞迴函式

  定義:如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。

   示例:計算乘階

1 def fact(n):
2     if n == 1:
3         return 1
4     else:
5         return n*fact(n-1)
6 sum=fact(3)
7 print(sum)

  注意:

    1、必須有一個明確的結束條件

    2、每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

    3、遞迴層次過多會導致棧溢位

十、匿名函式lambda

  lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。

  lambda函式的語法只包含一個語句,如下:

     

  示例:

student = [
    {'name':'小明','class':'一班','age':5},
    {'name':'小明','class':'二班','age':6},
    {'name':'小明','class':'三班','age':7},
]
#求最大年齡的資訊
max_age=max(student,key=lambda x:x['age'])
print(max_age)