第一類對象 函數名 == 變數名 函數對象可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 def wrapper(): def inner(): print("哈哈哈") return inner # 函數名可以像返回值一樣返回 ret = wrapper() ret() ...
第一類對象 -----函數名 == 變數名 函數對象可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 def wrapper(): def inner(): print("哈哈哈") return inner # 函數名可以像返回值一樣返回 ret = wrapper() ret() # 在函數外面訪問了函數內部的函數 函數可以進行參數進行傳遞 def func1(): print("朱祁鎮") def func2(): print("徐階") def func3(): print("王陽明") def func4(): print("魏忠賢") lst = [func1, func2, func3, func4] # 函數+() 就是調用. print(lst) ###function func2 at 0x000001A53FB298C8>, <function func3 at 0x000001A53FB29950>, <function func4 at 0x000001A53FB299D 是一個記憶體地址 lst = [func1(), func2(), func3(), func4()] ##函數是調用的,沒有retrun返回的是None print(lst) ###朱祁鎮 徐階 王陽明 魏忠賢 [None, None, None, None] 函數外面的訪問了函數內部的函數 def wrapper(): def inner(): print("哈哈哈") return inner ###函數名可以像返回值一樣返回 ret = wrapper() ret() ##在函數外面方位了函數內部的函數 閉包------函數的嵌套 內層函數中使用外層函數的變數 優點:1.保護變數不被其他人侵害 2.保持一個變數常駐記憶體 超級簡易版爬蟲 from urllib.request import urlopen # 導入一個模塊 # 幹掉數字簽名 import ssl ssl._create_default_https_context = ssl._create_unverified_context def func(): # 獲取到網頁中的內容, 當網速很慢的時候. 反覆的去打開這個網站. 很慢 content = urlopen("https://www.dytt8.net/").read() def inner(): return content.decode("gbk") # 網頁內容 return inner print("開始網路請求") ret = func() # 網路請求已經完畢 print("網路請求完畢") print("第一次", ret()[5]) ret()就是return返回的值,調用inner函數 print("第二次", ret()[5]) 如何查看一個是閉包 __closure__ 有東西就是閉包,沒有東西就不是閉包 迭代器---固定的思路.for迴圈 一個數據類型中包含了__iter__函數表示這個數據是可迭代的 dir(數據): 返回這個數據可以執行的所有操作 判斷迭代器和可迭代對象的方案(野路子) __iter__ 可迭代的 __iter__ __next__ 迭代器 lst = ['賈樟柯', '利安', '楊德昌', '王家衛'] it = lst.__iter__() print(it.__next__()) print(it.__next__()) print(it.__next__()) print(it.__next__()) print(it.__next__()) ###StopIteration 停止迭代 #想回去 it = lst.__iter__() #只能重新獲取迭代器 判斷迭代器和可迭代對象的方案(官方) from collections import Iterable, Iterator isinstance(對象, Iterable) 是否是可迭代的 isinstance(對象, Iterator) 是否是迭代器 官方通過代碼判斷是否是迭代器 藉助於兩個模塊 Iterator迭代器, 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 it = lst.__iter__() # 迭代器一定可迭代, 可迭代的東西不一定是迭代器 print(isinstance(it, Iterable)) # xxx是否是xxx類型的. True print(isinstance(it, Iterator)) # True for el in it: print(el) 結束的時候給我們扔出來一個錯誤stopiteration 模擬for迴圈 lst= [] # 拿迭代器 it = lst.__iter__() #獲取迭代器 while 1: try: #嘗試 el = it.__next__() #數據 print(el) except StopIteration: #####出錯誤,意味著數據拿完了 break #退出迴圈 特征: 1. 省記憶體(生成器) 2. 惰性機制 3. 只能向前. 不能後退 整合所有的數據類型進行遍歷(int,bool除外) 想回去:只能重新獲取迭代器 print(dir(bool)) # 沒有__iter__ for i in True: # 'bool' object is not iterable print(i) print(dir(range)) f = open("呵呵", mode="r", encoding="utf-8") print(dir(f)) 共性:所有帶有__iter__的東西都可以進行for迴圈, 帶有__iter__的東西就是可迭代對象 lst = ["賈樟柯", "李安", "楊德昌", "王家衛"] # 1. 只能向下執行, 不能反覆 # 2. 結束的時候會給我們扔出來一個錯誤 StopIteration # 3. 整合所有的數據類型進行遍歷(int,bool除外) # print("__iter__" in dir(lst)) it = lst.__iter__() # 拿到的是迭代器 <list_iterator object at 0x0000000001DCC160> print(it.__next__()) # 下一個 print(it.__next__()) # 下一個 print(it.__next__()) # 下一個 print(it.__next__()) # 下一個 # print(it.__next__()) # 下一個 # StopIteration 停止迭代 # 想回去 it = lst.__iter__() # 只能重新獲取迭代器 s = {"張無忌", "賈樟柯", "寶寶", "風扇哥", "門神"} it = s.__iter__() print(it.__next__()) print(it.__next__()) print(it.__next__()) print(it.__next__()) print(it.__next__())