Python迭代器iterator生成器generator使用解析
1. 迭代
根據(jù)記錄的前面的元素的位置信息 去訪問后續(xù)的元素的過程 -遍歷 迭代
2. 可迭代對(duì)象 iterable
如何判斷可迭代對(duì)象的3種方式
- 能夠被迭代訪問的對(duì)象 for in
- 常用可迭代對(duì)象-list tuple str
- from collections import Iterable
- isinstance(obj, Iterable)
3. 可迭代對(duì)象
可迭代對(duì)象通過__iter__方法提供一個(gè) 可以遍歷對(duì)象中數(shù)據(jù)的工具-迭代器
iter(可迭代對(duì)象) 可以獲取可迭代對(duì)象的迭代器
通過迭代器可以迭代訪問 數(shù)據(jù)
next(迭代器) ===== 迭代器對(duì)象.__next__()
可迭代對(duì)象的本質(zhì) 提供了一個(gè)迭代器(遍歷可迭代對(duì)象中的數(shù)據(jù))
如何獲取可迭代對(duì)象中的迭代器 迭代器對(duì)象 = iter(可迭代對(duì)象)
如果通過迭代器訪問可迭代對(duì)象中下一個(gè)元素 元素的值?。健ext(迭代器對(duì)象)
如果迭代器遍歷完成 拋出 停止迭代-異常StopIteration
如果需要實(shí)現(xiàn)一個(gè)迭代器 就需要實(shí)現(xiàn)__next__()
4. 迭代器 iterator
-- 迭代器訪問可迭代對(duì)象中數(shù)據(jù) 判斷對(duì)象是否是迭代器類型
from collections import Iterator isinstance(obj, Iterator)
自己實(shí)現(xiàn)
迭代器本身也是可迭代對(duì)象 __iter__() 提供迭代器(self)
下一個(gè)元素的值 = next(迭代器) =====> __next__()
實(shí)現(xiàn)一個(gè)可迭代對(duì)象
from collections import Iterable
from collections import Iterator
import time
class MylistIterator(object):
"""這是Mylist類型的對(duì)應(yīng)迭代器類型 """
def __init__(self,data):
# 需要被便利的數(shù)據(jù)
self.data = data
# 保存用戶訪問的位置
self.index = 0
def __iter__(self):
"""python規(guī)定 迭代器是一種可迭代對(duì)象"""
return self
def __next__(self):
"""next(ml_iterator) 相當(dāng)于調(diào)用迭代器對(duì)象的.__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):
"""可迭代對(duì)象"""
def __init__(self):
self.data = [1,2,3,4,5]
def __iter__(self):
"""提供迭代器"""
# 返回迭代器對(duì)象
mliter = MylistIterator(self.data)
return mliter
# ml是一個(gè)可迭代類型
ml = Mylist()
# 獲取可迭代對(duì)象的 迭代器對(duì)象
ml_iter = iter(ml)
print(isinstance(ml_iter, Iterator))
for i in ml:
print(i)
time.sleep(1)
"""
1 可迭代對(duì)象的本質(zhì) 提供了一個(gè)迭代器(遍歷可迭代對(duì)象中的數(shù)據(jù))
2 如何獲取可迭代對(duì)象中的迭代器 迭代器對(duì)象 = iter(可迭代對(duì)象)
實(shí)際上相當(dāng)于 可迭代對(duì)象.__iter__()
3 如果通過迭代器訪問可迭代對(duì)象中下一個(gè)元素 元素的值 = next(迭代器對(duì)象)
如果迭代器遍歷完成 拋出 停止迭代-異常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ù)存儲(chǔ)到集合中
print(list(Fib(10)))
#
# # 打印斐波那契數(shù)列的前10項(xiàng)的值
# # for i in Fib(10):
# # print(i)
# # 1 通過iter函數(shù)獲取可迭代對(duì)象 Iterable 的迭代器 iterator
# ml_iterator = iter(Fib(1000))
#
# # 2 在循環(huán)內(nèi)部不斷調(diào)用next(迭代器) 獲取下一個(gè)元素的值
# # 3 如果迭代完成 會(huì)拋出一個(gè)停止迭代的異常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á)式 中括號(hào)變圓括號(hào) 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)用生成器對(duì)象的是 必須使用next()
在后續(xù)的情況下 send和next可以混用
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python_array[0][0]與array[0,0]的區(qū)別詳解
今天小編就為大家分享一篇python_array[0][0]與array[0,0]的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python爬取門戶論壇評(píng)論淺談Python未來發(fā)展方向
這篇文章主要介紹了如何實(shí)現(xiàn)Python爬取門戶論壇評(píng)論,附含圖片示例代碼,講解了詳細(xì)的操作過程,有需要的的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
python?tkinter實(shí)現(xiàn)彈窗的輸入輸出
這篇文章主要為大家詳細(xì)介紹了python?tkinter實(shí)現(xiàn)彈窗的輸入輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Python+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à)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python內(nèi)建函數(shù)之raw_input()與input()代碼解析
這篇文章主要介紹了Python內(nèi)建函數(shù)之raw_input()與input()代碼解析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
opencv中顏色空間轉(zhuǎn)換函數(shù)cv2.cvtColor()使用
本文主要介紹了opencv中顏色空間轉(zhuǎn)換函數(shù)cv2.cvtColor()使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí)
這篇文章主要為大家介紹了Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10

