day13 迭代器和生成器
一、上節(jié)回顧和作業(yè)講解:
1、如果這個(gè)網(wǎng)頁沒有被爬取過就真的去訪問這個(gè)網(wǎng)頁,否則就返回之前訪問的時(shí)候緩存文件中的內(nèi)容
(重要的例子)
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) 網(wǎng)頁爬取和緩存2、回顧
裝飾器: ?在不修改一個(gè)函數(shù)的調(diào)用方式的前提下載一個(gè)函數(shù)的前后添加功能
裝飾器的本質(zhì):閉包函數(shù)
@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() login登錄log ?:必須會(huì):寫到文件里
def log(func):def inner(*args,**kwargs):print("你要調(diào)用%s函數(shù)了"%func.__name__)ret=func(*args,**kwargs)return retreturn inner @log def f1():print("f1") @log def f2():print("f2") f1() f2() logweb_content :進(jìn)階要求
二、今日內(nèi)容:
1、可迭代的:__inter__
列表 字典 元祖 字符串 集合
iterable ?:可迭代的
判斷是否是可迭代的:內(nèi)部含有__iter__方法的數(shù)據(jù)類型是可迭代的 ?——可迭代協(xié)議
print("__iter__"in dir([])) #True2、迭代器:__iter__ ?和__next__ ?(包含next方法的可迭代對(duì)象就是迭代器)
iterator ? :迭代器
迭代器你可以理解為一個(gè)容器,我們從這個(gè)容器當(dāng)中一個(gè)接著一個(gè)的把值取出來的過程就是迭代的過程
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__() #將可迭代的轉(zhuǎn)換為迭代器
print("__iter__"in dir(lst_iter)) #True print("__next__"in dir(lst_iter)) #True
print(lst_iter.__next__()) #1 迭代循環(huán) print(lst_iter.__next__()) #2
3、總結(jié):
(1)可迭代的必須含有__iter__方法 ? ? ?#可迭代協(xié)議
(2)迭代器比可迭代的多一個(gè)__next__方法
(3)迭代器:包含__next__,__iter__方法 ? ?#迭代器協(xié)議
(4)包含__next__方法的可迭代對(duì)象就是迭代器
(5)迭代器是可迭代的一部分,也就是可迭代的包含迭代器
#獲得迭代器:可迭代的.__iter__()
#使用迭代器:迭代器.__next__()
4、迭代器的工作原理
#惰性運(yùn)算 ?從前到后依次取值,過程不可逆 不可重復(fù)
#節(jié)省內(nèi)存
print("__iter__"in dir(range(10))) #True print("__neat__"in dir(range(10))) #False range_iter=range(10).__iter__() #轉(zhuǎn)換為迭代器 print(range_iter.__next__()) #0 迭代取值 print(range_iter.__next__()) #1 迭代取值5、用while模擬for循環(huán)
(1)for 循環(huán)是依賴迭代器的
(2)for循環(huán)是讓我們更簡(jiǎn)單的使用迭代器
(3)用迭代器取值不需要關(guān)心索引或者Key的取值問題
l=[1,2,3,4,5] l_iter=l.__iter__() #將可迭代的轉(zhuǎn)換為迭代器 while True:try:print(l_iter.__next__())except StopIteration:break?6、generator ?------生成器
最簡(jiǎn)單的生成器:生成器函數(shù)和普通函數(shù)之間的區(qū)別
? ? ? ?(1)生成器函數(shù)中含有yield關(guān)鍵字
(2)生成器函數(shù)調(diào)用時(shí)不會(huì)立即執(zhí)行,而是返回一個(gè)生成器
def g_func():yield 1 g=g_func() print(g.__next__()) #17、生成器函數(shù)(重要例子)衣服調(diào)用
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__())?
轉(zhuǎn)載于:https://www.cnblogs.com/number1994/p/7955178.html
總結(jié)
以上是生活随笔為你收集整理的day13 迭代器和生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noip模拟赛 radius
- 下一篇: VirtualBox安装Centos6.