2018.12.7 今日所學
今天主要的學習內容
1. 函式引數--動態傳參
2. 名稱空間, 區域性名稱空間, 全域性名稱空間, 作?域, 載入順序.
3. 函式的巢狀
4. gloabal, nonlocal關鍵字
一 .動態傳參 * **
動態傳參分為兩種:
1 .動態接受位置引數
我自己的理解是將你輸入的輸入全部賦值給你的變數引數 如:
def func(*content): pass func(1,2,3,4,5,6,7)
就是上面的將1-7全部給content,最後輸入的全部放到一個tuple中
注意: 動態接收引數的時候要注意 : 動態引數必須在位置引數後面
def chi(*food, a, b): print("我要吃", food, a, b) chi("大米飯", "小米飯", "黃瓜", "茄子") # 前兩個引數用位置引數來接收, 後面的引數用 動態引數接收
上面的程式碼是錯誤的, 因為*food 已經接收了所有的資料,a,b永遠接收不到資訊,系統報錯
由此我們得出總結:
順序 : 位置引數,動態引數* ,預設值引數
2.動態接收關鍵字引數
在python中我們使用**來接受動態關鍵字引數
def func(**kwargs): print(kwargs) func(a=1,b=2,c=3) func(a=1,b=3) 結果 : {'a': 1, 'b': 2, 'c': 3} {'a': 1, 'b': 2}
這個時候接收的是一個字典dict
最終我們得到的順序是:
位置引數 > *args > 預設值引數 > **kwargs
這四種引數可以任意的進行使用
這裡如果想要接收所有的引數 ,有一種無敵傳參(自己給的名字):
def func (*args ,**kwargs):
print(*args,**kwargs)
func()這裡使用者輸入的所有引數都可以拿到並輸出
當* ,**在形參的位置 相當於把輸入的東西聚合 ,聚合成元組 ,字典
當* ,**在實參位置的時候,把使用者輸入的東西按照順序打散
名稱空間
全域性名稱空間 --->我們直接在py 檔案中,函式外宣告的變數都屬於全域性名稱空間
區域性名稱空間 --->在函式宣告的變數中會放在區域性名稱空間
內建名稱空間 --->存放在python直譯器中為我們提供的名字 ,list ,tuple ,dict ,int ,str 這些都是內建名稱空間
載入順序: 內建名稱空間-->全域性名稱空間 -->區域性名稱空間
取值順序: 區域性名稱空間 -->全域性名稱空間-->內建名稱空間
a=10 def func(): a=20 print(a) func() #結果為20
作用域:作用域就是作用範圍 ,按照生效範圍來看分為 全域性作用域 和區域性作用域
全域性作用域: 包含了全域性名稱空間和內建名稱空間,在整個檔案的任何位置都可以使用(遵循從上到下逐個進行)
區域性作用域: 在函式內部可以使用
作用域名稱空間:
1. 全域性作用域: 全域性名稱空間+ 內建名稱空間 locals() 檢視全域性作用域內容
2. 區域性作用域: 區域性名稱空間 globals() 檢視當前作用域內容
函式的巢狀
1. 只要遇到了()就是函式的呼叫 ,如果沒有()就不是函式的呼叫
2, 函式的執行順序
def fun1(): print(111) def fun2(): print(222) fun1() fun2() print(111) # 函式的巢狀 def fun2(): print(222) def fun3(): print(666) print(444) fun3() print(888) print(33) fun2() print(555)
關鍵字global 和nonlocal
我們寫一個程式碼,首先在全域性宣告一個變數 ,然後在區域性呼叫這個變數,並改變這個變數的值
a=100 def func(): global a #這裡的global 是把外面的a 引入進來 (用的是外面的a),但是要注意,這裡將a修改後,外面的a也相應的發生了改變 a=28 print(a) func() print(a)
即 :global表示的不在用區域性的內容,改用全域性作用域的變數
nonlocal是呼叫上一級的內容 ,如果找不到,繼續往上找,直到找到全域性,但是找不到全域性
a=10 def func(): a=20 def pp(): nonlcal a #這裡的nonlcal就是呼叫了上一層的a=20 ,而不是a=10 print(a) pp() func()
nonlcal和global都是引入外面的內容 ,也同樣是修改了外面的內容