# 動態傳參:# * 表示接收所有 位置參數 的動態傳參# 傳參時自動把實參打包成 元祖 給形參 1 def chi(*food): 2 print(food) 3 return food 4 5 chi() # 動態傳參可以為空不傳參 6 # chi("紫菜湯",food="雞蛋湯") # * a... ...
# 動態傳參:
# * 表示接收所有 位置參數 的動態傳參
# 傳參時自動把實參打包成 元祖 給形參
1 def chi(*food): 2 print(food) 3 return food 4 5 chi() # 動態傳參可以為空不傳參 6 # chi("紫菜湯",food="雞蛋湯") # * args 不可接收關鍵字參數 7 8 chi("雞蛋湯","紫菜湯","疙瘩湯") 9 chi("雞蛋湯","紫菜湯","疙瘩湯","海帶燉豬肉","小雞燉蘑菇") # 返回一個元祖 10 # ('雞蛋湯', '紫菜湯', '疙瘩湯', '海帶燉豬肉', '小雞燉蘑菇')
# ** 表示接收 關鍵字參數 的動態傳參
# 把實參打包成 字典 傳給形參
1 def chi1(**food): 2 print(food) 3 4 chi1(good_food="哈哈",junk_food="呵呵",drink="嘻嘻") # 返回一個字典 5 # {'good_food': '哈哈', 'junk_food': '呵呵', 'drink': '嘻嘻'} 6 # chi1("哈哈","呵呵","吼吼") # TypeError ** kwargs 不可接收位置參數
# 參數順序 位置》*args》預設值》**kwargs 可以任意組合
# 無敵參數
1 # 無敵參數 2 def num(*args,**kwargs): 3 print(args,kwargs) 4 5 num(1,2,3,4,5,6,a="7",b="8",c="9") 6 # (1, 2, 3, 4, 5, 6) {'a': '7', 'b': '8', 'c': '9'}
1 lis = [1,2,3,4,5,6,7] 2 def fun(*args): # 在形參表示聚合多個 3 print(args) 4 5 fun(lis[0],lis[1],lis[2],lis[3],lis[4],lis[5],lis[6]) 6 fun(*lis) # 省去多次輸入完全等同於上面 把一個 列表/字元/元祖 打散成參數傳給形參 7 s = "2018年10月30日19:50:39" 8 fun(*s) # 在實參表示打散 9 10 dic = {"張無忌":"倚天屠龍記", "喬峰":"天龍八部", "郭靖":"射雕"} 11 def fun1(**kwargs): # 聚合 12 print(kwargs) 13 14 # fun1(張無忌=dic['張無忌'],喬峰="天龍八部") 15 fun1(**dic) # 把字典 打散 成關鍵字參數 傳給形參 省去上面一個個輸入 16 17 # 可得出結論 *, ** : 在形參: 聚合, 實參: 打散
# 命名空間 三種:
# 定義:我們稱存放名字和值的關係的空間叫做命名空間
# 內置命名空間 —— python解釋器
# python解釋器啟動就可使用的名字 存儲在內置命名空間 如:print() input() list tuple 等
# 內置的名字在解釋器啟動的時候被載入進記憶體
# 全局命令空間 —— 寫的代碼
# 程式從上到下被執行的過程中依次載入進記憶體的
# 放置了我們所色設置的變數名和函數名
# 局部命名空間 —— 函數 類, 方法, 其他模塊, 對象
# 函數內部定義的名字
# 調用函數的時候 才會產生空間 隨著函數執行結束清空被回收
# 在局部:可以使用全局、內置命名空間的名字
# 在全局:可以使用內置,不可使用局部
# 在內置:不可使用局部和全局的名字
1 # 在全局調用:全局命名空間->內置命名空間 2 def fun(): 3 a = 10 4 print(a) 5 6 fun() # a隨函數執行完畢已清空 7 # print(a) # name 'a' is not defined 全局不可使用局部 8 9 # 在局部調用:局部命名空間->全局命名空間->內置命名空間 10 a = 1 11 def func(x): 12 x = a 13 print(x) 14 15 func(10) # 列印 1 局部可調用全局 16 17 # 在內置命名空間:不可往下調用 因為運行前已經載入完成
# 內置——》全局——》局部 (依賴倒置關係:可逆不可順)
# 載入順序:內置命名空間(程式運行前載入)->全局命名空間(程式運行中:從上到下載入)->局部命名空間(程式運行中:調用時才載入)
# 作用域:作用域就是作用範圍,按照生效範圍來看分:全局作用域和局部作用域
# 全局作用域:
# 包含內置命名空間和全局命名空間,在整個文件任何位置都可使用(遵循從上到下逐行執行)
# 局部作用域:在函數內部可使用.
# 作用域命名空間:
# 全局作用域: 全局命名空間+內置命名空間
# 局部作用域: 局部命名空間
# 可通過globals()函數來查看全局作用域中的內容,也可以通過locals()來查看局部作用域中的變數和函數信息
1 a = 10 2 def func(): 3 a = 40 4 b = 20 5 def abc(): 6 print("哈哈") 7 print(a,b) 8 print(globals()) # 查看全局作用域(內置+全局)內容 9 print(locals()) # 查看局部作用域(函數 模塊 對象等內部)內容 10 11 func() 12 13 # 從局部找全局可以. 但是從全局找局部是不可以的
1 # 實例 2 def print(*args): # 聲明函數名 print 非內置print 3 pass 4 # print(args) # maximum recursion depth exceeded 自己調用自己 遞歸 這裡會報錯 5 6 def func(): 7 print("呵呵") 8 9 func() # 無返回值 調用函數 func 但裡面的print不是內置的,因此去上層找全局命名 print 自然是pass
# 函數嵌套
# 1.只要遇見了()就是函數的調用.如果沒有()就不是函數的調用
# 2.函數的執行順序
1 def fun2(): 2 print(222) 3 def fun3(): 4 print(666) 5 print(444) 6 fun3() 7 print(888) 8 print(33) 9 fun2() 10 print(555) 11 12 ''' 13 33 14 222 15 444 16 666 17 888 18 555 19 ''' 20 21 # 一個一個去套
# 關鍵字global和nonlocal
# 全局變數在局部, 可以用, 但是, 不能改
1 # 全局變數在局部, 可以用, 但是, 不能改 2 a = 10 3 def func(): 4 # #a = 20 # 並沒有改變全局變數, 創建了一個自己的變數 5 # a = a + 10 # 報錯 因為全局變數可能是公共的 改變之後影響其他調用 6 print(a) 7 8 func() 9 print(a)
# global表示.把變數從全局引入進來
1 a = 10 2 def func(): 3 global a # 直接從全局把變數強制拉進來 可改了 後續調用 a 都是改變後的值 4 a = a + 10 5 print(a) 6 func() # 20 7 print(a) # 20 8 9 10 11 # global 其他應用 (很少用) 12 def func(): 13 global a # 可以創建(升華)一個局部變數為全局變數 14 a = 30 15 16 func() 17 print(a) # 30
# nolocal 在局部,引入上一層名稱空間中的名字. 如果上一層沒有, 繼續上一層 .....
1 def outer(): 2 a = 10 3 def inner(): 4 nonlocal a # 把上一層的a拉過來 改變 在局部內的後續調用也跟著改變 5 a = 20 6 print(a) 7 print(a) # 10 8 inner() # 20 9 print(a) # 20 10 outer() 11 12 13 # 例子 14 a = 1 15 def fun_1(): 16 a = 2 17 def fun_2(): 18 nonlocal a 19 a = 3 20 def fun_3(): 21 a = 4 22 print(a) 23 print(a) 24 fun_3() 25 print(a) 26 print(a) 27 fun_2() 28 print(a) 29 print(a) 30 fun_1() 31 print(a) 32 33 # 1234331