一、命名空間
1、定義
名稱到物件的對映。命名空間是乙個字典的實現,鍵為變數名,值是變數對應的值。各個命名空間是獨立沒有關係的,乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。
2、命名空間的分類
1)、全域性命名空間(global):每個模組載入執行時建立的,記錄了模組中定義的變數,包括模組中定義的函式、類、其他匯入的模組、模組級的變數與常量。
2)、區域性命名空間(local):每個函式所擁有的命名空間,記錄了函式中定義的所有變數,包括函式的入參、內部定義的區域性變數。
3)、python內建命名空間(built-in):任何模組均可以訪問,放著內建的函式和異常(比如:input,print,str,list,tuple...)。
3、生命週期
3.1、載入順序
內建命名空間(程式執行前載入)-->全域性命名空間(程式執行中:從上到下載入)-->區域性命名空間(程式執行中:呼叫時才載入)
3.2、取值順序
在區域性呼叫:區域性命名空間-->全域性命名空間-->內建命名空間
在全域性呼叫:全域性命名空間-->內建命名空間
綜上所述,在尋找變數時,從小範圍,一層一層到大範圍去找尋。
4、作用域
4.1、定義
作用域是針對變數而言,指申明的變數在程式裡的可應用範圍。或者稱為變數的可見性。
4.2、分類
按照生效範圍可以分為全域性作用域和區域性作用域。
1)、全域性作用域:包含內建命名空間、全域性命名空間,在整個檔案的任意位置都能被引用、全域性有效
2)、區域性作用域:區域性命名空間,只能在區域性範圍內生效
4.3、兩個常用的內建函式
locals() 和globals(),它們提供了基於字典的訪問區域性和全域性變數的方式。
1)、locals():函式會以字典型別返回當前位置的全部區域性變數。
2)、globals():函式會以字典型別返回當前位置的全部全域性變數。
#在全域性作用域內
(globals())
(locals())
#輸出結果:,'
__builtins__
': '
builtins
' (built-in)>, '
__file__
': '
d:/python10/day10/homework.py
', '
__cached__
': none}, '
__builtins__
': '
builtins
' (built-in)>, '
__file__
': '
d:/python10/day10/homework.py
', '
__cached__
': none}
#在函式區域性作用域內
name = '
wusir
'def
func():
name = '
alex
(globals())
print(locals()) #
func()
#輸出結果:, '
__builtins__
': '
builtins
' (built-in)>, '
__file__
': '
d:/python10/day10/homework.py
', '
__cached__
': none, '
name
': '
wusir
', '
func
': }
5、關鍵字(global 與 nonlocal)
5.1、global的作用
1)、宣告乙個全域性變數
2)、在區域性作用域想要對全域性作用域的全域性變數進行修改時,需要用到 global(限於字串,數字)
deffunc():
global
a a = 2
print(a) #
2func()
print(a) #2#
輸出結果
2 2
注意:對可變資料型別(list,dict,set)可以直接引用不用通過global(以下是例項)
li = [1,2,3]dic =
defchange():'a
')dic['q
'] = 'g'
print(dic) #
print(li) #
[1, 2, 3, 'a']
change()
print(li) #
[1, 2, 3, 'a']
print(dic) #
#輸出結果
[1, 2, 3, 'a'
][1, 2, 3, 'a'
]
5.2、nonlocal的作用
1)、不能修改全域性變數
2)、在區域性作用域中,對父級作用域(或者更外層作用域非全域性作用域)的變數進行引用和修改,並且引用的哪層,從那層及以下此變數全部發生改變
defadd_b():
b = 42
defdo_global():
b = 10
print(b) #
10def
dd_nonlocal():
nonlocal b
b = b + 20
print(b) #
30dd_nonlocal()
print(b) #
30do_global()
print(b) #
42add_b()
#輸出結果
10 30 30 42
二、函式的巢狀
deffun1():
print(111)
deffun2():
print(222)
fun1()
fun2()
#輸出結果
222111
函式的作用域鏈:小範圍作用域可以使用大範圍的變數,但是反之不行,它是單向的。
print(111) #執行順序--1
deffun2():
print(222) #
執行順序--3
deffun3():
print(666) #
執行順序--5
print(444) #
執行順序--4
fun3()
print(888) #
執行順序--6
print(333) #
執行順序--2
fun2()
print(555) #
執行順序--7
#輸出結果
111 333 222 444 666 888 555
Python之高階函式
一 什麼是高階函式 函式作為實參傳遞給函式的或者函式名為返回值的函式稱為高階函式。1 實參傳遞給函式 2 函式名為返回值 二 系統內建的高階函式 1 map函式 至少需要兩個引數,第乙個引數是函式名,第二個引數是序列 str,list,tuple map功能 把序列中的每乙個元素作為引數,傳給函式進...
Python之高階函式
做過swift開發的童鞋都知道,在swift中有許多的高階函式 map,filter,reduce,zip等 這些在開發中讓我們節省大量 python中同樣有許多的內建函式,但是這裡也只介紹幾個常用的高階函式 根據提供的函式對指定序列做對映,並返回對映後的序列 map function,iterab...
python之高階函式
函式程式設計及其優勢 無 不修改狀態,表示式形式,專注與計算,接近自然語言。便於 熱公升級,無狀態不用考慮併發過程中的資源搶占及鎖問題。函式也是物件,也可以賦值給變數,當然函式的引數也可以為另一函式。map 是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依...