迭代器/生成器
迭代器
1.什么是迭代器
迭代取值的工具
2.為什么用迭代器
優(yōu)點:
1、提供一種不依賴索引的取值方式
2、更節(jié)省內(nèi)存(自定義迭代器是,它所占的內(nèi)存是功能本身的代碼量,)
缺點:
1、沒有按索引取值靈活
2、迭代器對象是一次性的,值可以取完,再想取值重新把可迭代對象定義為迭代器對象
3. 如何用迭代器
可迭代的對象: str\list\tuple\dict\set\文件對象
但凡內(nèi)置有__iter__方法的對象都稱之為可迭代對象
(可迭代對象).__iter__=====》》迭代器對象
迭代器對象: 文件對象
既內(nèi)置有__iter__方法又內(nèi)置有__next__方法的對象都稱之為迭代器對象
?
__iter__與__next__簡便寫法
k={'a':111,'b':222,'c':333} iter_k=iter(k) # k.__iter__() print(next(iter(k))) #iter_d.__next__()
4.for循環(huán)的底層工作原理(必須是可迭代類型)
1 把可迭代對象轉(zhuǎn)換為迭代器對象,
2 調(diào)迭代器的__next__方法,取值,取值
3 用try和except監(jiān)測異常,在把迭代器中值取完的情況下結(jié)束循環(huán)
?
方式一方式二是一個引子 方式一 k={'a':111,'b':222,'c':333} k1=k.__iter__()print(k1.__next__())print(k1.__next__())print(k1.__next__())print(k1.__next__()) ------------------------------------------------ 方式二 k={'a':111,'b':222,'c':333} k1=k.__iter__() while True:v=k1.__next__()print(v) ---------------------------------------------- 方式一二執(zhí)行結(jié)果一樣,都會報錯(超出索引范圍) 那么通過添加try和except來阻止報錯 k={'a':111,'b':222,'c':333} k1=k.__iter__() while True:try: #監(jiān)管代碼執(zhí)行,遇到異常,捕捉異常,開始和except后的值匹配,是否是這個錯誤v=k1.__next__()print(v)except StopIteration:break View Code?
?
?
?
?
生成器
一、什么是生成器
只要函數(shù)內(nèi)部包含有yield關(guān)鍵字,那么函數(shù)名()得到的結(jié)果就是生成器,并且不會執(zhí)行函數(shù)內(nèi)部代碼
二、如何用生成器
但凡函數(shù)內(nèi)出現(xiàn)yield關(guān)鍵字,再去調(diào)用函數(shù)不會立即執(zhí)行函數(shù)體代碼,通過next()調(diào)用
def func():print('a')yield 1print('s')res=yield 2print('c')res=yield 3g=func() s=next(g) print(s) next(g) print(res) next(g) print(res) next(g)通過next()調(diào)用yield,因為生成器是迭代器的一種,所以在next執(zhí)行完也會報錯,仍通過try監(jiān)測異常 def func.. .... try:g=func()print(next(g))next(g)next(g)next(g) except:print(0) View Code?
總結(jié)yield:
1. 提供一種自定義迭代器的解決方案
2. yield & return
相同點: 都可以返回值,返回值沒有類型限制和個數(shù)限制
不同點: 函數(shù)遇到return會結(jié)束函數(shù)體
? 遇到y(tǒng)ield是讓函數(shù)暫停在某一個位置
小練習(xí),自定義range
def a(start,stop,s):while start<stop:yield startstart+=s for i in a(1,50,2): 范圍及步長自定義print(i)
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pdun/p/10271723.html
總結(jié)
- 上一篇: Zend Studio使用教程:使用PH
- 下一篇: nginx_upsteam