鐵樂學Python day10 函式2

2021-08-17 22:20:42 字數 4016 閱讀 3058

今天書接昨天的函式繼續去學習了解:

昨天說到函式的動態引數。

*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。希望作...