1.作用域
在python中,作用域分為兩種:全局作用域和局部作用域。
全局作用域是定義在文件級別的變量,函數名。而局部作用域,則是定義函數內部。
關于作用域,我要理解兩點:a.在全局不能訪問到局部定義的變量 b.在局部能夠訪問到全局定義的變量,但是不能修改全局定義的變量(當然有方法可以修改)
下面我們來看看下面實例:
x = 1def funx(): x = 10 print(x) # 打印出10funx()print(x) # 打印出1
如果局部沒有定義變量x,那么函數內部會從內往外開始查找x,如果沒有找到,就會報錯
x = 1def funx(): print(x) # 打印出1funx()print(x) # 打印出1x = 1def funx(): def func1(): print(x) # 打印出1 func1()funx()print(x) # 打印出1
因此,關于作用域的問題,只需要記住兩點就行:全局變量能夠被文件任何地方引用,但修改只能在全局進行操作;如果局部沒有找到所需的變量,就會往外進行查找,沒有找到就會報錯。
2.高級函數
我們知道,函數名其實就是指向一段內存空間的地址,既然是地址,那么我們可以利用這種特性來。
a函數名可以作為一個值
def delete(ps): import os filename = ps[-1] delelemetns = ps[1] with open(filename, encoding='utf-8') as f_read,/ open('tmp.txt', 'w', encoding='utf-8') as f_write: for line in iter(f_read.readline, ''): if line != '/n': # 處理非空行 if delelemetns in line: line = line.replace(delelemetns,'') f_write.write(line) os.remove(filename) os.rename('tmp.txt',filename)def add(ps): filename = ps[-1] addelemetns = ps[1] with open(filename, 'a', encoding='utf-8') as fp: fp.write("/n", addelemetns)def modify(ps): import os filename = ps[-1] modify_elemetns = ps[1] with open(filename, encoding='utf-8') as f_read, / open('tmp.txt', 'w', encoding='utf-8') as f_write: for line in iter(f_read.readline, ''): if line != '/n': # 處理非空行 if modify_elemetns in line: line = line.replace(modify_elemetns, '') f_write.write(line) os.remove(filename) os.rename('tmp.txt', filename)def search(cmd): filename = cmd[-1] pattern = cmd[1] with open(filename, 'r', encoding="utf-8") as f: for line in f: if pattern in line: print(line, end="") else: print("沒有找到")dic_func ={'delete': delete, 'add': add, 'modify': modify, 'search': search}while True: inp = input("請輸入您要進行的操作:").strip() if not inp: continue cmd_1 = inp.split() cmd = cmd_1[0] if cmd in dic_func: dic_func[cmd](cmd_1) else: print("Error")b.函數名可以作為返回值
def outer(): def inner(): pass return inners = outer()print(s)######輸出結果為#######<function outer.<locals>.inner at 0x000000D22D8AB8C8>
c..函數名可以作為一個參數
def index(): print("index func")def outer(index): s = index s() outer(index)######輸出結果#########index func所以滿足上面兩個條件中的一個,都可以稱為高級函數.
3.閉包函數
閉包函數必須滿足兩個條件:1.函數內部定義的函數 2.包含對外部作用域而非全局作用域的引用
下面通過一些實例來說明閉包函數:
實例一:以下僅僅在函數內部定義了一個函數,但并非閉包函數.
def outer(): def inner(): print("inner func excuted") inner() # 調用執行inner()函數 print("outer func excuted")outer() # 調用執行outer函數####輸出結果為##########inner func excutedouter func excuted實例二:以下在函數內部定義了一個函數,而且還引用了一個外部變量x,那么這個是閉包函數么?答案:不是
x = 1def outer(): def inner(): print("x=%s" %x) # 引用了一個非inner函數內部的變量 print("inner func excuted") inner() # 執行inner函數 print("outer func excuted")outer()#####輸出結果########x=1inner func excutedouter func excuted在回頭來看看對閉包函數的定義,是不是兩條都滿足?聰明的你,一定發現不滿足第二條.對,這里的變量x,是屬于全局變量,而非外部作用于域的變量。再來看看下面例子:
def outer(): x = 1 def inner(): print("x=%s" %x) print("inner func excuted") inner() print("outer func excuted")outer()#####輸出結果#########x=1inner func excutedouter func excuted顯然,上面實例滿足閉包函數的條件。現在,你應該清楚,作為一個閉包函數,必須得滿足上述的兩個條件,缺一不可。但是,一般情況下,我們都會給閉包函數返回一個值.這里先不說為什么.在接下來的內容中,你會看到這個返回值的用途.
def outer(): x = 1 def inner(): print("x=%s" %x) print("inner func excuted") print("outer func excuted") return inner # 返回內部函數名 outer()現在我們來抽象的定義一下閉包函數。它是函數和與其相關的引用環境組合而成的實體。在實現深約束時,需要創建一個能顯式表示引用環境的東西,并將它與相關的子程序捆綁在一起,這樣捆綁起成為閉包。在上面實例中,我們可以發現,閉包函數,它必須包含自己的函數以及一個外部變量才能真正稱得上是一個閉包函數。如果沒有一個外部變量與其綁定,那么 主站蜘蛛池模板: 涟水县| 波密县| 邢台县| 北宁市| 宾川县| 邵东县| 梅河口市| 军事| 辰溪县| 洱源县| 上高县| 明溪县| 化州市| 班戈县| 宜州市| 潮州市| 咸丰县| 铜陵市| 视频| 舞钢市| 体育| 赣州市| 陇川县| 双江| 巩义市| 寿光市| 商河县| 南丰县| 五台县| 广西| 额尔古纳市| 根河市| 甘南县| 建昌县| 福泉市| 瑞金市| 炎陵县| 清水河县| 开封县| 江西省| 西盟|