Python迭代器iterator生成器generator使用解析
1. 迭代
根據(jù)記錄的前面的元素的位置信息 去訪問后續(xù)的元素的過程 -遍歷 迭代
2. 可迭代對象 iterable
如何判斷可迭代對象的3種方式
- 能夠被迭代訪問的對象 for in
- 常用可迭代對象-list tuple str
- from collections import Iterable
- isinstance(obj, Iterable)
3. 可迭代對象
可迭代對象通過__iter__方法提供一個 可以遍歷對象中數(shù)據(jù)的工具-迭代器
iter(可迭代對象) 可以獲取可迭代對象的迭代器
通過迭代器可以迭代訪問 數(shù)據(jù)
next(迭代器) ===== 迭代器對象.__next__()
可迭代對象的本質(zhì) 提供了一個迭代器(遍歷可迭代對象中的數(shù)據(jù))
如何獲取可迭代對象中的迭代器 迭代器對象 = iter(可迭代對象)
如果通過迭代器訪問可迭代對象中下一個元素 元素的值 = next(迭代器對象)
如果迭代器遍歷完成 拋出 停止迭代-異常StopIteration
如果需要實(shí)現(xiàn)一個迭代器 就需要實(shí)現(xiàn)__next__()
4. 迭代器 iterator
-- 迭代器訪問可迭代對象中數(shù)據(jù) 判斷對象是否是迭代器類型
from collections import Iterator isinstance(obj, Iterator)
自己實(shí)現(xiàn)
迭代器本身也是可迭代對象 __iter__() 提供迭代器(self)
下一個元素的值 = next(迭代器) =====> __next__()
實(shí)現(xiàn)一個可迭代對象
from collections import Iterable from collections import Iterator import time class MylistIterator(object): """這是Mylist類型的對應(yīng)迭代器類型 """ def __init__(self,data): # 需要被便利的數(shù)據(jù) self.data = data # 保存用戶訪問的位置 self.index = 0 def __iter__(self): """python規(guī)定 迭代器是一種可迭代對象""" return self def __next__(self): """next(ml_iterator) 相當(dāng)于調(diào)用迭代器對象的.__next__()""" if self.index < len(self.data): ret = self.data[self.index] self.index += 1 return ret else: # 訪問完成 應(yīng)該拋出異常 raise StopIteration class Mylist(object): """可迭代對象""" def __init__(self): self.data = [1,2,3,4,5] def __iter__(self): """提供迭代器""" # 返回迭代器對象 mliter = MylistIterator(self.data) return mliter # ml是一個可迭代類型 ml = Mylist() # 獲取可迭代對象的 迭代器對象 ml_iter = iter(ml) print(isinstance(ml_iter, Iterator)) for i in ml: print(i) time.sleep(1) """ 1 可迭代對象的本質(zhì) 提供了一個迭代器(遍歷可迭代對象中的數(shù)據(jù)) 2 如何獲取可迭代對象中的迭代器 迭代器對象 = iter(可迭代對象) 實(shí)際上相當(dāng)于 可迭代對象.__iter__() 3 如果通過迭代器訪問可迭代對象中下一個元素 元素的值?。健ext(迭代器對象) 如果迭代器遍歷完成 拋出 停止迭代-異常StopIteration """ print(isinstance(ml, Iterable))
用迭代器完成斐波那契數(shù)列(難點(diǎn)在next)
"""兔子隊(duì)列 某一項(xiàng)的值是前兩項(xiàng)的和 1 1 2 3 5 8 """ class Fib(object): def __init__(self,n): """初始化操作""" # n代表數(shù)列的長度 self.n = n # 下標(biāo)記錄 self.index = 0 self.number1 = 0 self.number2 = 1 def __iter__(self): return self def __next__(self): """next(迭代器) ?。剑剑健?__next__()""" if self.index < self.n: ret = self.number1 self.number1,self.number2 = self.number2,self.number2+self.number1 self.index += 1 return ret else: raise StopIteration # list() tuple()都可以接收迭代器 并且將遍歷到的數(shù)據(jù)存儲到集合中 print(list(Fib(10))) # # # 打印斐波那契數(shù)列的前10項(xiàng)的值 # # for i in Fib(10): # # print(i) # # 1 通過iter函數(shù)獲取可迭代對象 Iterable 的迭代器 iterator # ml_iterator = iter(Fib(1000)) # # # 2 在循環(huán)內(nèi)部不斷調(diào)用next(迭代器) 獲取下一個元素的值 # # 3 如果迭代完成 會拋出一個停止迭代的異常StopIteration
5. 生成器 generator
生成器是一種特殊的迭代器 --- 是迭代器, 并且有自己的特點(diǎn)
1 創(chuàng)建生成器表達(dá)式 [] ----》 (x for x in range(100))
2 生成器函數(shù)
凡是有yield關(guān)鍵字的函數(shù)都不是普通函數(shù)了 而是生成器函數(shù)
# 列表推導(dǎo)式 lis=[x for x in range(10)] print(lis) # 生成器表達(dá)式 中括號變圓括號 data=(x for x in range(10)) print(data) # 遍歷data for i in data: print(i)
結(jié)果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <generator object <genexpr> at 0x02AE7120> 1 3 5 7 9
6. yield關(guān)鍵字的作用
掛起當(dāng)前函數(shù) 將后面表達(dá)式的值 返回到調(diào)用生成器的地方
接收數(shù)據(jù) 并喚醒當(dāng)前函數(shù) 并且緊接著上次運(yùn)行的地址繼續(xù)執(zhí)行
7. 喚醒生成器的兩種方式
生成器.send("數(shù)據(jù)")
next(生成器) === 生成器.send(None)
在第一次調(diào)用生成器對象的是 必須使用next()
在后續(xù)的情況下 send和next可以混用
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python_array[0][0]與array[0,0]的區(qū)別詳解
今天小編就為大家分享一篇python_array[0][0]與array[0,0]的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python爬取門戶論壇評論淺談Python未來發(fā)展方向
這篇文章主要介紹了如何實(shí)現(xiàn)Python爬取門戶論壇評論,附含圖片示例代碼,講解了詳細(xì)的操作過程,有需要的的朋友可以借鑒參考下,希望可以有所幫助2021-09-09python?tkinter實(shí)現(xiàn)彈窗的輸入輸出
這篇文章主要為大家詳細(xì)介紹了python?tkinter實(shí)現(xiàn)彈窗的輸入輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Python+matplotlib實(shí)現(xiàn)填充螺旋實(shí)例
這篇文章主要介紹了Python+matplotlib實(shí)現(xiàn)填充螺旋實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01淺談python中頻繁的print到底能浪費(fèi)多長時(shí)間
今天小編就為大家分享一篇淺談python中頻繁的print到底能浪費(fèi)多長時(shí)間,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python內(nèi)建函數(shù)之raw_input()與input()代碼解析
這篇文章主要介紹了Python內(nèi)建函數(shù)之raw_input()與input()代碼解析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10opencv中顏色空間轉(zhuǎn)換函數(shù)cv2.cvtColor()使用
本文主要介紹了opencv中顏色空間轉(zhuǎn)換函數(shù)cv2.cvtColor()使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Python光學(xué)仿真之對光的干涉理解學(xué)習(xí)
這篇文章主要為大家介紹了Python光學(xué)仿真之對光的干涉理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10