1. 程式人生 > >【python函式】函式

【python函式】函式

// 函式使用期間:變數的作用域一定要注意,主要體現在 1. 變數作用域內是否被定義 2. 可變物件傳參是否會被修改

1. 函式名稱空間

    概念:記憶體中變數名和物件的對應關係 // 字典
    // 每個名稱空間都是獨立的存在,可以存在相同名字的變數

    分類:
    1. 區域性名稱空間:函式所擁有的名稱空間,記錄了函式中定義的變數、入參等
    2. 全域性名稱空間:模組級的名稱空間  // 模組載入時建立
    3. 內建名稱空間:放置內建函式和異常  // 任何地方都可以使用
    生命週期:
    1. 函式呼叫時建立、執行結束或拋異常刪除
    2. 模組載入時建立,一直在python直譯器退出
    3. python直譯器建立時建立

    *注意*
    python直譯器載入期間,會加載出內建名稱空間和全域性名稱空間,區域性命名是在呼叫時建立,函式呼叫結束自動退出。

2. 函式作用域

    作用域:針對變數,指的是變數的可用範圍 // 其實作用域就是指的名稱空間內變數的作用範圍

    分類:
    只有函式、類、模組有作用域,程式碼塊沒有作用域

    // 變數查詢範圍 LEGB
    1. 區域性作用域
    2. 巢狀作用域
    3. 全域性作用域
    4. 內建作用域

    兩個特殊引數:
    1. global // 使得內部作用域內的變數可以修改全域性變數
    2. nolocal  // 使用內部作用域內的變數可以修改巢狀作用域內的變數

    工廠函式和巢狀作用域  // 內層函式都是可以記住頂層函式的狀態
    """
    def func():
                x = 1
                def action():
                        x = 1
                        pass
                return action  // 此處的action函式會記住外層函式func的變數
    """

3. 函式引數

    可變物件傳參和不可變物件傳參
            1. 不可變物件:值傳遞,內部不可修改
            2. 可變物件:指標傳遞,內部可以修改

    避免可變物件傳參的修改
            1. 呼叫時拷貝,避免在函式內部修改外部可變物件
            func(a,b[:])
            2. 函式內部進行拷貝
            func(a,b):
                    b = b [:]
    可變引數型別
    # 函式頭部:收集任意數量的引數
    *args ==> args會是一個元祖
    **args ==> args會是一個字典

4. lambda表示式

5. 內建函式

    1. map函式
        list(map(lambda x:x + 2,[1,2,3,4])) => [3,4,5,6]  // map對序列中每個元素執行相同的操作
    2. filter函式
        list(map(lambda x:x > 3,[1,2,3,4,5])) => [4,5]  // 返回結果為True的元素
    3. reduce函式
        from functools import reduce
        reduce(lambda x,y:x+y,[1,2,3,4]) => 10 // python3 reduce已經移到內建名稱空間裡面