標籤:回憶一下 通過 地址 oba end python解譯器 動態 python 記錄
函數的動態參數(萬能參數)*args **kwargs
為了擴充,對於傳入的實參數量不固定,而建立的
*args 用法
在函數定義的時候,*args 彙總,即將所有實參的位置參數彙總到一個元組上,並將這個元組賦值給args.
def fuc1(a,*args): print(a) print(args)fuc1(1,2,3,4,5,6,7) #1 (2, 3, 4, 5, 6, 7)
在函數定義的時候,**kwargs 彙總成字典,即將實參所有的關鍵字參數彙總成一個字典的索引值對
def func1(a,**kwargs): print(a) print(kwargs)func1(a = "taibai",num = "alex",age = 18,sex = "男")#taibai#{‘num‘: ‘alex‘, ‘age‘: 18, ‘sex‘: ‘男‘} * 的魔性用法
在函數定義時,在位置後表示彙總
在函數執行時,在位置後表示打散(方便理解)
l1 = [1,2,3]l2 = [111,22,33,‘alex‘]def func1(*args): print(args)func1(*l1,*l2) #(1, 2, 3, 111, 22, 33, ‘alex‘) 可以理解為先打散後再在函數內進行彙總成一個元組
#同理,**字典也可以這樣打散後再彙總
形參位置優先順序
位置參數在最左邊,其後為*args,其次為預設參數,最後為**kwargs,一般來說只存在一兩個進行運算,幾乎不存在四個全都在的情況
名稱空間
我們首先回憶一下Python代碼啟動並執行時候遇到函數是怎麼做的,從Python解譯器開始執行之後,就在記憶體中開闢裡一個空間,每當遇到一個變數的時候,
就把變數名和值之間對應的關聯性記錄下來,但是當遇到函數定義的時候,解譯器只是象徵性的將函數名讀如記憶體,表示知道這個函數存在了,
至於函數內部的變數和邏輯,解譯器根本不關心。等執行到函數調用的時候,Python解譯器會再開闢一塊記憶體來儲存這個函數裡面的內容,這個時候,才關注函數裡面有哪些變數,
而函數中的變數回儲存在新開闢出來的記憶體中,函數中的變數只能在函數內部使用,並且會隨著函數執行完畢,這塊記憶體中的所有內容也會被清空。我們給這個‘存放名字與值的關係’的空間起了一個名字-------命名空間。代碼在運行伊始,建立的儲存“變數名與值的關係”的空間叫做全域命名空間;在函數的運行中開闢的臨時的空間叫做局部命名空間。
全域名稱空間:是一個儲存變數名和變數值對應地址的資訊的一個容器局部名稱空間:在函數運行中臨時開闢的空間。(臨時存在)內建名稱空間:python中內部已經定義好的函數範圍全域範圍:包括全域名稱空間和內建名稱空間局部範圍:局部名稱空間(臨時存在的,調用完成後就消失)
取值順序:就近原則,先從局部名稱空間找,再到全域名稱空間找,最後在到內建函數空間找
載入順序:內建名稱空間---》全域名稱空間(當程式執行時)---》局部名稱空間(當函數調用時)
函數的嵌套:一步一步看,不要粗心
即在函數內部嵌套函數
# x=1# def f1():# def f2():# print(locals())# print(x)# print(locals())# return f2# x=100# def f3(func):# x=2# print(locals())# func()# x=10000# f3(f1())# print(x) #最後輸出結果為10000
關鍵字:global nonlocalglobal
1.聲明一個全域變數
2.在局部範圍想要對全域範圍的全域變數進行修改時,需要用到global
注意:對於可變的資料類型(list,dict,set)可以直接引用而不需要通過global
l2 = [1,3,4]dic ={"a":"b","c":"d"}def func1(): l2.append(6) dic["q"] = 3 print(dic) #{‘a‘: ‘b‘, ‘c‘: ‘d‘, ‘q‘: 3} print(l2) #[1, 3, 4, 6]func1()print(dic) #{‘a‘: ‘b‘, ‘c‘: ‘d‘, ‘q‘: 3}print(l2) #[1, 3, 4, 6]
nonlocal
1.不能修改全域變數
2.在局部範圍中,對父級範圍(或者更外層,非全域範圍)的變數進行引用和修改,並且用的哪層,從那成即以下此變數全部發生改變
# def func1():# b = 42# def func2():# nonlocal b# b += 10# print(b) #b = 52# def func3():# nonlocal b# b += 20# print(b) #b= 72# func3()# func2()# func1()
函數的範圍鏈:
小範圍範圍可以使用大範圍的變數,但是反之不行,因為他是單項的
騎士計劃-python全棧10 函數進階