一、上節回顧和作業講解:
1、如果這個網頁沒有被爬取過就真的去訪問這個網頁,否則就返回之前訪問的時候緩存文件中的內容
(重要的例子)


from urllib.request import urlopen def wrapper(func):def inner(*args, **kwargs):with open("web","rb") as f:web_content=f.read()if not web_content:web_content = func(*args, **kwargs)with open("web","wb") as f:f.write(web_content)return web_contentreturn inner @wrapper def get_url(url):content=urlopen(url).read()return content web_content=get_url("http://www.cnblogs.com/number1994/p/7941399.html") print(web_content)
2、回顧
裝飾器: ?在不修改一個函數的調用方式的前提下載一個函數的前后添加功能
裝飾器的本質:閉包函數
@wrapper ? ? ?#get_url=wrapper(get_url)
def get_url(url):
content=urlopen(url).read()
return content
login :了解原理?


flag=False def login(func):def inner(*args, **kwargs):global flagif flag==False:name=input("用戶名:")password=input("密碼:")if name=="liu" and password=="123":print("登錄成功!")flag=Trueif flag==True:ret=func(*args,**kwargs)return retreturn inner @login def art():print("歡迎登錄文章頁") def dar():print("歡迎登錄日志頁") art() dar()
log ?:必須會:寫到文件里


def log(func):def inner(*args,**kwargs):print("你要調用%s函數了"%func.__name__)ret=func(*args,**kwargs)return retreturn inner @log def f1():print("f1") @log def f2():print("f2") f1() f2()
web_content :進階要求
二、今日內容:
1、可迭代的:__inter__
列表 字典 元祖 字符串 集合
iterable ?:可迭代的
判斷是否是可迭代的:內部含有__iter__方法的數據類型是可迭代的 ?——可迭代協議
print("__iter__"in dir([])) #True
2、迭代器:__iter__ ?和__next__ ?(包含next方法的可迭代對象就是迭代器)
iterator ? :迭代器
迭代器你可以理解為一個容器,我們從這個容器當中一個接著一個的把值取出來的過程就是迭代的過程
lst_iter=[1,2,3,4,5]
#判斷類型 print("__iter__"in dir(lst_iter)) #True print("__next__"in dir(lst_iter)) #False
lst_iter=lst_iter.__iter__() #將可迭代的轉換為迭代器
print("__iter__"in dir(lst_iter)) #True print("__next__"in dir(lst_iter)) #True
print(lst_iter.__next__()) #1 迭代循環 print(lst_iter.__next__()) #2
3、總結:
(1)可迭代的必須含有__iter__方法 ? ? ?#可迭代協議
(2)迭代器比可迭代的多一個__next__方法
(3)迭代器:包含__next__,__iter__方法 ? ?#迭代器協議
(4)包含__next__方法的可迭代對象就是迭代器
(5)迭代器是可迭代的一部分,也就是可迭代的包含迭代器
#獲得迭代器:可迭代的.__iter__()
#使用迭代器:迭代器.__next__()
4、迭代器的工作原理
#惰性運算 ?從前到后依次取值,過程不可逆 不可重復
#節省內存
print("__iter__"in dir(range(10))) #True print("__neat__"in dir(range(10))) #False range_iter=range(10).__iter__() #轉換為迭代器 print(range_iter.__next__()) #0 迭代取值 print(range_iter.__next__()) #1 迭代取值
5、用while模擬for循環
(1)for 循環是依賴迭代器的
(2)for循環是讓我們更簡單的使用迭代器
(3)用迭代器取值不需要關心索引或者Key的取值問題
l=[1,2,3,4,5] l_iter=l.__iter__() #將可迭代的轉換為迭代器 while True:try:print(l_iter.__next__())except StopIteration:break
?6、generator ?------生成器
最簡單的生成器:生成器函數和普通函數之間的區別
? ? ? ?(1)生成器函數中含有yield關鍵字
(2)生成器函數調用時不會立即執行,而是返回一個生成器
def g_func():yield 1 g=g_func() print(g.__next__()) #1
7、生成器函數(重要例子)衣服調用
def cloth():for i in range(1000):yield "衣服%s"%i g=cloth() for i in range(50):print(g.__next__()) for i in range(50):print(g.__next__())
?