def fn(): print("我叫fn") fn() print(fn)## <function fn at 0x0000000001D12E18> fn() gn = fn #函數名可以進行賦值 print(gn)# <function fn at 0x0000000001D12E18> gn ...
def fn(): print("我叫fn") fn() print(fn)## <function fn at 0x0000000001D12E18> fn() gn = fn #函數名可以進行賦值 print(gn)# <function fn at 0x0000000001D12E18> gn() fn = 666 print(fn) #666 def func1() print("朱祁鎮") def func2() print("徐傑") def func3(): print("王陽明") def func4(): print("魏忠賢") lst = [func1,func2,func3,func4]#函數+() 就是調用 print(lst) lst[0]() for el in lst: #el是列表中的每一項 el() #拿到的是函數. 執行函數 def wrapper(): def inner(): print("哈哈哈") return inner#函數名可以像返回值一樣返回 ret = wrapper() #接收的是inner函數 ret() #調用函數inner 在函數外面訪問了函數內部的函數 函數可以作為參數進行傳遞 def func1(): print("謝晉") def func2(): print('楊士奇') def func3(): print('徐渭') def func4(): print("柳如是") #代理.裝飾器的雛形 de proxy(a) print("我是代理") a() print("代理執行完畢") proxy(func1) proxy(func2) #將函數當做參數進行傳參 閉包 閉包的優點 1.可以保持變數不被其他人侵害 2.保持一個常量常駐與記憶體 def wrapper(): a = "哈哈" #如果把a放到全局作用域是不安全的一種寫法,因為好多內容用著同一個變數,則把它放到一個局部作用域中 name = "周傑倫" def inner print(name)#在內層函數中使用了外層的函數的局部變數 print(a) return inner #返回函數名 ret = wrapper() #ret是inner函數 ret() #調用函數 def wrapper(): name = "周傑倫" #局部變數常駐與記憶體
def inner():
print(name) #在內層函數中使用外層函數的局部變數
return inner #返回函數名
#inner()
ret = wrapper() #ret是一個內層函數 ret() #ret是inner,執行的時機是不確定的,必須保證裡邊的name是存在的 #超級簡單的爬蟲 from urllib.request import urlopen #導入一個模塊 def func(): #獲取到網頁中的內容,當網速很慢的時候.反覆的打開這個網站 很慢
content = urloppen("https://www.dytt8.net/").read() def inner():
return content.decode("gbk") #網頁內容
return inner
print("開始網路請求") ret = func() #網路請求已經關閉 print("網路請求完畢") print("第一次",ret()) print("第二次",ret()) #載入到記憶體 不用每次都進行網路請求 直接進行記憶體的調用 但是變數多的話 記憶體可能撐不下 def wrapper(): name = "alex"
def inner():
print("name")
print(inner.__closure__) #查看是否閉包.有內容就是閉包,沒有內容就不是閉包
inner()
wrappe() 迭代 s = "今天下午考試,你們還要睡覺嗎 " for c in s: #字元串是一個可迭代對象 print (c) for i in 123: # 'int' object is not iterable整型是不可以迭代的 print(i) dir(對象) #可以幫我們查看xxx數據能夠執行的操作 print(dir(str)) #__iter__ 字元串 列表 字典 元組 集合 是可以迭代的 int 和 bool 是不可以迭代的 共性:所有帶有__iter__的東西可以進行for迴圈,帶有__iter__的東西就是可以迭代的 lst = ["賈樟柯", "李安", "楊德昌", "王家衛"] it = lst.__iter__() #拿到的是迭代器 print(it.__next__()) #下一個 print(it.__next__()) #下一個 print(it.__next__()) #下一個 print(it.__next__()) #下一個 print(it.__next__()) #下一個 會報錯 stopinteration 停止迭代 ##想回去只能重新獲得迭代器 1.只能項下執行,不能反覆 2.結束的時候會扔給我們一個錯誤 stopiteration 3.整合所有的數據類型進行遍歷 (int,bool除外) 用while迴圈來模擬for迴圈 it = list.__iter__() while 1: try: el = it.__next__: #拿數據 print(el) except stopiteration: #出現錯誤說明數據拿完了 break #退出迴圈 官方通過代碼判斷是否是迭代器 藉助於兩個模塊 Iteration 迭代器,iterable 可迭代的 from collections import iterable,iterator lst = [1,2,3] print(lst.__next__()) print(isinstance(lst, Iterable)) # xxx是否是xxx類型的. True print(isinstance(lst, Iterator)) # False 迭代器一定是可迭代的,可迭代的東西不一定是迭代器 isinstens(參數,iterable) 判斷xxx是不是某某類型