1. 程式人生 > >python 函數指動態形參,作用域

python 函數指動態形參,作用域

無敵 裏的 系統 才會 ron 位置順序 自動 取值 als

函數的動態形參, 作用域

一 動態形參

如果我們需要給?一個函數傳參, ?而參數?又是不確定的. 或者我給?一個 函數傳很多參數, 我的形參就要寫很多, 很?麻煩, 怎麽辦呢. 我們可以考慮使?用動態參數

動態參數分成兩種: 1. 動態接收位置參數, 按位置順序接受實參 ,如果有位置參數必須寫在動態參數前面 默認值參數寫在最後方可生效, 傳參是必須寫 形參 = 值

def func(*args):

  print(args)

func(1,2,3,4,5)

>>>(1,2,3,4,5) # 接收到的實參聚合成元組

def func(a,*args)

  print(a,args)

func("這樣", 1,2,3,4,5)

>>>這樣 (1,2,3,4,5)

2 動態接收關鍵字參數

def func(**kwargs)

**kwargs 關鍵字的動態傳參, 接收到的是字典

def func(**kwargs): # key word arguments
print(kwargs)

func(a=10, b=20, jay="周傑倫", jj="林俊傑")

>>>{"a": 10, "b": 20, "jay": 周傑倫, "jj": "林俊傑"}

func(張無忌=dic[‘張無忌‘], 謝遜=dic[‘謝遜‘], 範瑤=dic[‘範瑤‘])
func(**dic) # 這裏的** 是把字典打散. 字典的key作為參數的名字, 字典的值作為參數的值傳遞給形參

小結

在形參上
1. 位置參數
2. 默認值參數
3. 動態參數

  1. *args 位置參數的動態傳參. 系統會自動的把所有的位置參數聚合成元組
  2. **kwargs 關鍵字的動態傳參. 系統會自動把所有的關鍵字參數聚合成字典
  3. def func(*args, **kwargs): 無敵傳參
  4. 順序: 位置參數, *args, 默認值, **kwargs
  5. 在使用的時候, 可以任意的進行搭配

4. 在實參上. *, **表示的打散. 在形參. *,** 表示聚合

二 作用域 :作?用域就是作?用範圍, 按照?生效範圍來看分為 全局作?用域和局部作?用域

1 全局作?用域: 包含內置命名空間和全局命名空間. 在整個?文件的任何位置都可以使?用(遵循 從上到下逐?執?).

局部作?用域: 函數內部的變量命名空間 在函數內部可以使?用.

在python解釋器開始執?行行之後, 就會在內存中開辟?一個空間, 每當遇到?一個變量量的時候, 就 把變量量名和值之間的關系記錄下來, 但是當遇到函數定義的時候, 解釋器只是把函數名讀入內 存, 表?示這個函數存在了了, ?至於函數內部的變量量和邏輯, 解釋器是不關?心的. 也就是說?一開始 的時候函數只是加載進來, 僅此?而已, 只有當函數被調?用和訪問的時候, 解釋器才會根據函數 內部聲明的變量量來進?行行開辟變量量的內部空間. 隨著函數執?行行完畢, 這些函數內部變量量占?用的空 間也會隨著函數執?行行完畢?而被清空.

我們給存放名字和值的關系的空間起?一個名字叫: 命名空間. 我們的變量量在存儲的時候就 是存儲在這片空間中的.

命名空間分類:

@. 全局命名空間--> 我們直接在py?文件中, 函數外聲明的變量量都屬於全局命名空間

2. 局部命名空間--> 在函數中聲明的變量量會放在局部命名空間

3. 內置命名空間--> 存放python解釋器為我們提供的名字, list, tuple, str, int這些都是內 置命名空間

@作?用域命名空間:

1. 全局作?用域: 全局命名空間 + 內置命名空間

2. 局部作?用域: 局部命名空間

@加載順序:

1. 內置命名空間
2. 全局命名空間

3. 局部命名空間(函數被執?行行的時候)

@取值順序:

1. 局部命名空間

2. 全局命名空間

3. 內置命名空間

@重要關鍵字

globals(): 查詢全局變量命名空間的內容

locals() :查詢當前作用域變量命名空間的內容

global表?不再使?用局部作?用域中的內容了了. ?而改?用全局作?用域中的變量

nonlocal 表?示在局部作?用域中, 調?用?父級命名空間中的變量, 引入最近的一層,沒有則創建

python 函數指動態形參,作用域