1. 程式人生 > >day 11 前方高能-迭代器

day 11 前方高能-迭代器

第一類物件 -----函式名  == 變數名 函式物件可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 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__())