day 11 前方高能-迭代器
阿新 • • 發佈:2018-12-10
第一類物件 -----函式名 == 變數名
函式物件可以像變數一樣進行賦值
還可以作為列表的元素進行使用
可以作為返回值返回
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__())