摘要:第一種情況打印結(jié)果為第二種打印結(jié)果為因?yàn)槿绻J(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。
名稱空間與作用域
1.變量儲(chǔ)存在一個(gè)內(nèi)存空間中
2.當(dāng)程序運(yùn)行的時(shí)候代碼從上到下依次執(zhí)行,它會(huì)將變量與值的關(guān)系存儲(chǔ)在一個(gè)空間中,這個(gè)空間叫名稱空間,命名空間,全局名稱空間
3.當(dāng)程序遇到函數(shù)時(shí),它會(huì)將函數(shù)名存在內(nèi)存中,函數(shù)體漠不關(guān)心
4.當(dāng)程序執(zhí)行的時(shí)候,內(nèi)存會(huì)臨時(shí)開辟一個(gè)空間,存放函數(shù)體里的代碼(變量,代碼等)
5.函數(shù)外面訪問不到臨時(shí)空間的內(nèi)容,隨著函數(shù)執(zhí)行完畢,臨時(shí)名稱空間會(huì)被釋放掉,向這個(gè)臨時(shí)開辟的空間也叫臨時(shí)名稱空間,也叫局部名稱空間
python名稱空間分為三種:
1.內(nèi)置名稱空間
2.全局名稱空間
3.局部名稱空間
按照作用域分為兩種:
全局作用域
1.內(nèi)置名稱空間 2.全局名稱空間
局部作用域
1.局部名稱空間
加載順序
內(nèi)置名稱空間---全局名稱空間(當(dāng)程序執(zhí)行時(shí))---局部名稱空間(函數(shù)調(diào)用時(shí))
取值順序
局部名稱空間(函數(shù)調(diào)用時(shí))---全局名稱空間(當(dāng)程序執(zhí)行時(shí))---內(nèi)置名稱空間
注:取值順序是單向不可逆的
1.取值又叫引用,局部名稱空間可以臨時(shí)像全局名稱空間引用,但是無法修改 2.取值是從小到大取值LEGB - L=最里層的局部作用域 - E=父親級別的局部作用域 - G=全局作用域中的全局名稱空間 - B=全局作用域中的內(nèi)置名稱空間
內(nèi)置函數(shù)globals和locals的方法:
globles
globales返回一個(gè)字典,字典里的內(nèi)容是全局名稱空間的內(nèi)容
locals
locals返回一個(gè)字典,當(dāng)前位置的所有變量(看locals的位置是否在函數(shù)體里還是在全局里)
#1. print(globals()) print(locals()) #打印結(jié)果: {"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x004DB4B0>, "__spec__": None, "__annotations__": {}, "__builtins__":, "__file__": "E:/python/day04/1.py", "__cached__": None} {"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x004DB4B0>, "__spec__": None, "__annotations__": {}, "__builtins__": , "__file__": "E:/python/day04/1.py", "__cached__": None}
#2. def func(): a = 12 b = 20 print(locals()) print(globals()) func() #打印結(jié)果: {"b": 20, "a": 12} {"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x0044B4B0>, "__spec__": None, "__annotations__": {}, "__builtins__":, "__file__": "E:/python/day04/1.py", "__cached__": None, "func": }
關(guān)鍵字global和nonlocal的方法:
global
1.global可以引用全局變量,并且改變?nèi)肿兞?br> 2.在局部作用域聲明一個(gè)全局變量
nonlocal
1.不能操作全局變量
2.在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進(jìn)行引用和修改,并且引用的哪層,從那層及以下此變量全部發(fā)生改變。
注:對于可變的數(shù)據(jù)類型list,dict,set,不用引用global,nonlocal
注:如果默認(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。
#1.第一種情況: def extendList(val,list=[]): list.append(val) return list list1 = extendList(10) print("list1=%s"%list1) # [10,] list2 = extendList(123,[]) print("list2=%s"%list2) # [123,] list3 = extendList("a") print("list3=%s"%list3) #[10,"a"] 打印結(jié)果為: list1=[10] list2=[123] list3=[10, "a"] #2.第二種: def extendList(val,list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList("a") print("list1=%s"%list1) print("list2=%s"%list2) print("list3=%s"%list3) 打印結(jié)果為: list1=[10, "a"] list2=[123] list3=[10, "a"] 因?yàn)椋喝绻J(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。
1.global實(shí)例:
def func(): global a a = 3 func() print(a) #打印結(jié)果為:3 count = 1 def search(): global count count = 2 search() print(count) #打印結(jié)果為2
2.nonloacl實(shí)例:
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() #30 print(b) #30 do_global() #10 print(b) add_b() #打印結(jié)果為: 10 30 30 42函數(shù)
函數(shù)的嵌套與調(diào)用:
#函數(shù)的嵌套 def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 #函數(shù)的調(diào)用 max4(1,2,3,4)
函數(shù)名的本質(zhì)
1.打印函數(shù)名
def func(): print("in func") f = func print(f) #打印結(jié)果為:為一塊內(nèi)存地址
2.函數(shù)名可以作為容器類數(shù)據(jù)的元素
def func1(): print(111) def func2(): print(222) def func3(): print(333) l1 = [func1, func2, func3] for i in l1: i() #打印結(jié)果為: 111 222 333
3.函數(shù)名可以作為函數(shù)的參數(shù)
def func1(): print(111) def func2(x): print(x) x() print(222) func2(func1) #打印結(jié)果為:111 222
4.函數(shù)名可以作為函數(shù)的返回值
def func1(): return 111 def func2(x): # x = func1 print(222) return x ret = func2(func1) # func1 print(ret()) print(ret) #打印結(jié)果為: 222 111
總結(jié):
函數(shù)名的應(yīng)用,第一類對象
- 函數(shù)名打印的出來的是個(gè)內(nèi)存地址,加()號就可以運(yùn)行 - 函數(shù)名可以作為容器類型內(nèi)的元素 - 函數(shù)名可以作為傳遞的參數(shù) - 函數(shù)名可以作為函數(shù)的返回值,return把值給函數(shù)的執(zhí)行者
閉包函數(shù)
- 內(nèi)層函數(shù)對外層函數(shù)非全局變量的引用,就叫做閉包 - 判斷是否是閉包:__closure__ - 如果python解釋器遇到了閉包,他有個(gè)機(jī)制,這個(gè)閉包不會(huì)隨著函數(shù)的結(jié)束而釋放 - 裝飾器@語法糖,裝飾器放在需要裝飾的函數(shù)的上邊,利用的就是閉包函數(shù)
裝飾器:
#測試func1函數(shù)的執(zhí)行時(shí)間 def timmer(f): def inner(*args,**kwargs): start_time = time.time() ret = f(*args,**kwargs) end_time = time.time() print("此函數(shù)的執(zhí)行效率%s" % (end_time - start_time)) return ret return inner @timmer def func1(): time.sleep(0.3) print("非常復(fù)雜......") func1() #格式為: def wrapper(f): def inner(*args,**kwargs): """被裝飾函數(shù)執(zhí)行之前的操作""" ret = f(*args,**kwargs) """被裝飾函數(shù)執(zhí)行之后的操作""" return ret return inner # 裝飾器 本質(zhì)就是閉包 # 裝飾器根本作用:在不影響原函數(shù)執(zhí)行的基礎(chǔ)上,增加一些額外的功能登錄認(rèn)證,打印日志等等。
內(nèi)褲可以用來遮羞,但是到了冬天它沒法為我們防風(fēng)御寒,聰明的人們發(fā)明了長褲,有了長褲后寶寶再也不冷了,裝飾器就像我們這里說的長褲,在不影響內(nèi)褲作用的前提下,給我們的身子提供了保暖的功效。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41777.html
用十種編程語言開發(fā)計(jì)算器應(yīng)用 C語言C#(windows桌面軟件)Swift (ios應(yīng)用)pythonDart(Flutter應(yīng)用,跨平臺(tái),適用安卓、ios、mac、windows、web)Java(安卓App)Kotlin (安卓App)Js+Html+Vue(H5應(yīng)用)微信小程序抖音小程序 安卓Kotlin語言版 開發(fā)工具 Android Studio 如何下載 工程截圖 關(guān)鍵代碼文...
摘要:是一個(gè)基于的模板引擎。模板中未被定義的變量將被認(rèn)為是一個(gè)字符串。公眾號回復(fù)全棧,領(lǐng)取前端,,產(chǎn)品經(jīng)理,微信小程序,等資源合集大放送。公眾號回復(fù)面試,領(lǐng)取面試實(shí)戰(zhàn)學(xué)習(xí)資源。 Velocity是一個(gè)基于java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。 當(dāng)Velocity應(yīng)用于web...
摘要:為什么網(wǎng)頁性能會(huì)變高要回答這個(gè)問題,需要回頭看是單線程的知識(shí)點(diǎn)。在分析的過程中,發(fā)現(xiàn)了的源碼中使用了很多鏈?zhǔn)浇Y(jié)構(gòu),回調(diào)鏈,任務(wù)鏈等,這個(gè)主要是為了增刪時(shí)性能比較高 系列文章 React Fiber源碼分析 第一篇 React Fiber源碼分析 第二篇(同步模式) React Fiber源碼分析 第三篇(異步狀態(tài)) React Fiber源碼分析 第四篇(歸納總結(jié)) 前言 Rea...
閱讀 2324·2021-11-22 12:01
閱讀 2001·2021-11-12 10:34
閱讀 4526·2021-09-22 15:47
閱讀 2837·2019-08-30 15:56
閱讀 2870·2019-08-30 15:53
閱讀 2411·2019-08-30 13:53
閱讀 3387·2019-08-29 15:35
閱讀 3132·2019-08-29 12:27