標籤:超出 分享 對比 引用 迭代 div bubuko 函數定義 工作
今日主要內容
1.動態參數
2.命名空間或名稱空間
3.函數的嵌套
4.關鍵字global和nonlocal
動態函數
動態參數*args ,**kwargs
(1)*args
接收的是實參對應的所有位置參數(實參中超出形參位置的),並將其放在元組中.
例1.*args正確放置的位置(不帶預設參數)
例2:帶預設參數,不影響預設參數的取值
總結:
形參對應順序:位置參數,*args,預設參數
(2)**kwargs 動態傳參
將所有關鍵字參數(超過形參設定的關鍵字參數)添加到一個字典裡.
例3:**kwargs正確使用
最終的排列順序:
例4:
總結:
最終順序:位置參數,*args,預設參數,**kwargs
一般工作的書寫方式:
def funcl(*args,**kwargs):
pass
funcl
知識點: *的應用
例5:*args,*的作用
將各個可迭代的資料類型轉換成元組形式,以前是元組的,直接套用原式
例6:**kwargs 的** 作用
總結 *,**
在函數的調用執行時,
*可迭代對象,代表打散(list,tuple,str,dict(鍵))將元素一一添加到args。
**字典,代表打散,將所有索引值對放到一個kwargs字典裡。
在函數定義時, *args,**kwargs代表的是彙總。
def func(*args,**kwargs): # 彙總
print(args)
print(kwargs)
func(*,**)#打散
=================================================================
2.命名空間,名稱空間
命名空間一共分為三種:
全域命名空間
局部命名空間
內建命名空間
*內建命名空間中存放了python解譯器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。
三種命名空間之間的載入與取值順序:
載入順序:內建命名空間(程式運行前載入)->全域命名空間(程式運行中:從上到下載入)->局部命名空間(程式運行中:調用時才載入)
取值順序:
在局部調用:局部命名空間->全域命名空間->內建命名空間
在全域調用:全域命名空間->內建命名空間
綜上所述,在找尋變數時,從小範圍,一層一層到大範圍去找尋。
如簡單描述:
載入為向下的箭頭,取值為向上的箭頭.
範圍
範圍就是作用範圍,按照生效範圍可以分為全域範圍和局部範圍。
全域範圍:包含內建名稱空間、全域名稱空間,在整個檔案的任意位置都能被引用、全域有效
局部範圍:局部名稱空間,只能在局部範圍內生效
globals和locals方法
例7:比較全域和局部範圍區別
取的值全部放在字典裡面.
全域名稱空間:py3中內建的所有變數
局部名稱空間:根據所在位置,對變數進行展示,如果所在的函數中有變數,則列印函數的變數,如果則空,只尋找當前級內.
對比
函數的嵌套
解決思路:
1.先確認函數什麼執行,沒有看到調用函數,則函數不執行.即函數名()
2.代碼從上到下依次執行.
3.調用函數:函數裡面從上至下依次執行
例8:通過舉例理解上面的內容,就好理解了
4 關鍵字:global 和 nonlocal (聲明變數)
global:
1,在局部空間內,聲明一個全域變數。
2,在局部範圍想要對全域範圍的全域變數進行修改時,需要用到 global(限於字串,數字)。
例9:
如果不用global聲明,則外部是找不到內部的變數的.
如果聲明,則外部可以使用此變數
2,在局部空間內改變一個全域變數
例10:
nonlocal #將內部變數,引用到外部,不包括全域
1,不能修改全域變數。
2.在局部範圍中,對父級範圍(或者更外層範圍非全域範圍)的變數進行引用和修改,
並且引用的哪層,從那層及以下此變數全部發生改變。(只要在函數內,就可以引用到外層,只要出了函數,到全域下就錯誤)
總結:
global和nonlocal用法相同,nonlocal不能反用到全域下,global可以從局部到全域這樣使用.
Python 基礎第十天