今天書接昨天的函式繼續去學習了解:
昨天說到函式的動態引數。
*args 動態引數,萬能引數
args接受的就是實參對應的所有剩餘的位置引數,並將其放在元組( )中。
deffunc
(x, y, z, *args):
print(x, y, z)
print(args)
func(1, 2, 'a', 'b', 'c', 34)
12 a
('b', 'c', 34)
**kwargs 動態引數
將非位置對應的所有的關鍵字引數放到乙個字典中。
(排除形參中位置引數對應的實參中的關鍵字引數)
deffunc
(x, y, z, *args, ***='男', **kwargs):
print(x, y, z)
print(args)
print(***)
print(kwargs)
func(1, 2, 'a', 'b', 'c', 34, m='yue', n=12, ***='女', p='r')
12 a
('b', 'c', 34)
女從形參的角度來看,它們的順序應為:
位置引數在最前,*args次之,
預設引數因為形式上是關鍵字引數的式樣故要排在*args後,而要在**kwargs之前。
(位置引數,*args,預設引數,**kwargs)
在函式的呼叫(執行)時,*加乙個可迭代物件(列表,元祖,字串,字典等)代表解包,
(列表元祖打散成列表中的每個元素,字串打散成每個字元,字典打散成每個鍵)
並將元素一 一新增進args。
如下例:
def
func
(*args):
return args
l1 = [1, 2, 30]
l2 = [1, 2, 33, 21, 45, 60]
# 要求將l1 和 l2 轉化成元祖,
# 並且裡面包含所有l1和l2的每乙個元素,相同元素也得重複。
# 解:
tu = func(*l1, *l2)
print(tu)
(1, 2, 30, 1, 2, 33, 21, 45, 60)
也可以簡單理解成*是求可迭代物件的每乙個元素。
而在函式的定義時,*args代表的是聚合(打包成元祖)
**運用只限於字典(因它存在有鍵值對,可兩兩對應上),
同樣在函式的呼叫執行時,**dict(乙個字典物件),代表將字典所有的鍵值對放到kwargs字典裡。
(解包打散字典)
例:def
func
(**kwargs):
return kwargs
dic =
dic2 =
# 字典的鍵得是唯一,如果兩個字典同鍵雖然不同值,執行下面函式的**運用也會報錯
dic3 = func(**dic, **dic2)
print(dic3)
在函式定義時,**kwargs代表的是聚合(成字典)
全域性命名空間,放置變數與對應的值(有的還有記憶體位址對應)的關係的命名空間。
當執行函式的時候,記憶體開闢出乙個臨時命名空間(又叫區域性命名空間),存放該函式內的變數與值的關係。
隨著函式的執行完畢,臨時命名空間也隨之關閉。
內建命名空間,(python的內建函式),所有的內建函式等儲存的空間。
載入順序:
內建命名空間—>全域性命名空間—>(函式執行時)—>區域性命名空間。
取值順序:
剛好與載入順序相反,優先順序為:
區域性命名空間—>全域性命名空間—>內建命名空間。
函式的巢狀:
函式在被呼叫的時候才執行;函式裡面同樣**遵循從上至下依次執行;
作用域就是作用範圍,按照生效範圍可以分為全域性作用域和區域性作用域。
全域性作用域:包含內建命名空間、全域性命名空間,在整個檔案的任意位置都能被引用、全域性有效。
區域性作用域:區域性命名空間,只能在區域性範圍內生效。
由作用域引申出兩個函式方法globals()和locals()
例:
def
func
(): a = 33
b = 22
print(locals())
print(globals())
func()
c = 40
print(locals())
由上例可以看到,函式中locals儲存的是
因為它的作用域是在區域性命名空間中,所以它儲存的變數和值並不多,而在函式之外再列印的locals就不同了,它的作用域擴大了,但是不包括區域性,所以裡面的值裡可以找到』c』:40而找不到a,b的值。
在函式中使用locals()方法可以很方便返回在這個臨時命名空間作用域中所有的變數的值,呈字典返回,所以還是有它常用到的地方的。
global關鍵字,nonlocal關鍵字:
global:
1、宣告乙個全域性變數。
2、在區域性作用域想要對全域性作用域的全域性變數進行修改時,需要用到global(限於字串,數字)。
例:
a = 2
deffunc
(): a = 5
func()
print(a) #這時候a返回的是2
a = 2
deffunc
():global a
a = 5
func()
print(a) #使用了global後返回的是5
注:對可變資料型別(list,dict,set)可以直接引用不用通過global。
li = [1,2,3]
dic =
defchange
(): dic['q'] = 'g'
print(dic)
print(li)
change()
print(li)
print(dic)
[1, 2, 3, 'a']
[1, 2, 3, 'a']
nonlocal:
1、不能修改全域性變數。
2、在區域性作用域中,對父級作用域(或者更外層作用域非全域性作用域)的變數進行引用和修改,並且引用的哪層,從那層及以下此變數全部發生改變。
def
add_b
(): b = 42
defdo_global
(): b = 10
print(b)
defdd_nonlocal
():nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
1030
3042
【補充】:
python是用命名空間來記錄變數的軌跡的,命名空間是乙個dictionary,鍵是變數名,值是變數值。
當一行**要使用變數 x 的值時,python 會到所有可用的名字空間去查詢變數,按照如下順序:
1)區域性名字空間 - 特指當前函式或類的方法。
如果函式定義了乙個區域性變數 x, 或乙個引數 x,python 將使用它,然後停止搜尋。
2)全域性名字空間 - 特指當前的模組。如果模組定義了乙個名為 x 的變數,函式或類,python 將使用它然後停止搜尋。
3)內建名字空間 - 對每個模組都是全域性的。作為最後的嘗試,python 將假設 x 是內建函式或變數。
python的全域性名字空間儲存在乙個叫globals()的dict物件中;
區域性名字空間儲存在乙個叫locals()的dict物件中。
我們可以用print (locals())來檢視該函式體內的所有變數名和變數值。
end
鐵樂學Python day09 函式
今天我們來學習函式。產生的原由,若沒有函式,會顯得重複 多,可讀性差,也會造成重複造輪子的情景。故產生了函式,用來封裝好乙個功能,它是以功能為導向的。例如自己定義乙個函式 def my len def python中的關鍵字,用來宣告和定義乙個函式 my len 函式名,命名規範與變數命名的一樣 d...
python day 10 魔法方法
title python day 10 魔法方法 date 2019 11 05 20 08 56 categories import time as t class mytimer def init self self.prompt 未開始計時 self.unit 年 月 日 時 分 秒 self...
學習Python Day10 函式高階
1.什麼是返回值 返回值就是從函式內容傳遞到函式外部的資料 預設情況下函式內部產生的新資料,在函式外部不能使用 2.怎麼確定函式返回值 a.python中每個函式都有返回值,返回值是什麼就看執行函式體的時候遇到return關鍵字後面的資料就是什麼 如果沒有遇到return,返回值就是none。希望作...