迭代器與生成器的使用
友情提示:檢視部落格前,請開啟目錄,查詢內容。感謝您前來參考,希望對您有用
迭代器,迭代的工具
什麼是迭代器?
指的是一個重複的過程,每一次重複稱為一次迭代,並且每一次重複的結果是下一次重複的初始值
l=['a','b','c']
count=0
while count <len(l):
print(l[count])
count+=1
為什麼要有迭代器
1、對於序列型別:str,list,tuple,可以依賴索引來迭代取值
2、對於dict,set,檔案,python必須為我們提供一種不依賴於索引的迭代取值的方式—>迭代器
可迭代的物件
物件內建函式帶有iter的都稱為可迭代的物件
str name='lqx' name.__iter__
list l=[1,2,3] l.__iter__
tuple t=(1,2,3) t.__iter__
dict d={'name':'lqx','age':18,'sex':'male'} d.__iter__
set s={'a','b','c'} s.__iter__
file f=open('a.txt','w',encoding='utf-8') f.__iter__
迭代器物件
檔案即是可迭代物件,也是迭代器物件
f.__iter__
f.__next__
迭代器總結
1、可迭代物件不一定是迭代器物件
2、迭代器物件一定是可迭代的物件
3、呼叫obj.iter()方式,得到的是迭代器物件(對於迭代器物件,執行iter得打的仍然是它本身)
d={'name':'egon','age':18,'sex':'male'}
d_iter=d.__iter__() #使用iter之後,生成的d_iter是迭代器
print(d_iter,type(d_iter))
print(d_iter.__next__()) #next的倆種使用方式
print(next(d_iter))
print(next(d_iter))
print(next(d_iter)) #迭代器d_iter沒有值的時候,會丟擲異常:StopIteration
print(next(d_iter))
如何去除next取不到中導致StopIteration異常
#下面是如何去除StopIteration異常
while True:
try: #使用try:去除異常
print(next(d_iter))
except StopIteration: #去除異常StopIteration
break
for迴圈詳解:
1、呼叫in後面的obj_iter=obj.iter()
2、k=obj_iter.next()
3、捕捉stopiteration異常,結束迭代
d={'name':'lqx','age':19,'sex':'male'}
for k in d:
print(k)
迭代器優缺點總結
優點:
1、提供一種統一的、不依賴與索引的取值方式,為for迴圈提供了依據
2、迭代器同一時間在記憶體中只有一個值—>更節省記憶體空間
缺點:
1、只能往後取,並且是一次性的
2、不能統計值的個數,即長度
l=[1,2,3,4,5]
l_iter=l.__iter__()
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(len(l_iter)) #TypeError: object of type 'list_iterator' has no len()
生成器,就是生成迭代器
什麼是生成器
只要在函式體內出現yield關鍵字,那麼再執行函式就不會執行函式程式碼,會得到一個結果,該結果就是生成器
def func():
print('---->1')
yield 1
print('---->2')
yield 2
print('---->3')
yield 3
a=func()
print(next(a)) #next(a),會執行到第一個yield結束,返回結果是yield後面的返回值
next(a)
next(a)
生成器就是迭代器
g=func()
res1=next(g)
print(res1)
res2=next(g)
print(res2)
res3=next(g)
print(res3)
>>>
---->1
1
---->2
2
---->3
3
yield的功能
yield為我們提供了一種自定義迭代器物件的方法
yield與return的區別:
1、yield可以返回多次值
2、函式暫停與再繼續的狀態是由yield幫我們儲存的
3、yield在函式中也就是暫停的意思,並且返回yield後面的值
obj=range(1,1000000000000,2)
obj_iter=obj.__iter__()
print(next(obj_iter))
print(next(obj_iter))
print(next(obj_iter))
print(next(obj_iter))
製作一個range內建函式:
#製作一個range函式
def range_it(start,stop,step=1):
while stop > start:
yield start
start=start + step
for i in range_it(1,20,2):
print(i)
製作一個類似於linux中管道的小程式
import time
# 小練習::tail -f access.log | grep '404'
def tail(filepath): #檢測是否有新的寫入資訊,如果有一條就給yield,作為函式的返回結果。
with open(filepath,'rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if line:
yield line
else:
time.sleep(0.05)
def grep(lines,pattern): #傳入tail檢測到新增加的行,然後打印出來這一行並賦值給line,再做判斷404,在就使用yield返回這一行
for line in lines:
# print(line)
line=line.decode('utf-8')
if pattern in line:
yield line
lines=grep(tail('a.txt'),'404') #grep()函式執行的結果返回的yield的值,給他賦值,
for line in lines: #使用for去迴圈取出lines中的值
print(line)
生成器瞭解知識點:yield表示式的用法
生成器使用yield表示式,就是給yield初始化下,然後給他傳任意值
這裡需要先給yield傳入一個None的值
e.send:
1、從暫停的位置將值傳給yield
2、與next一樣
def eater(name):
print('%s ready to eat' %name)
food_list=[]
while True:
food=yield food_list
food_list.append(food)
print('%s start to eat %s' %(name,food))
e=eater('alex')
#首先要做一個初始化的操作:也就是必須要先給yield傳入一個None的值。
print(e.send(None)) #next(e)
print(e.send('一桶水')) #給yield賦值一次,然後會執行下面的程式碼,然後迴圈到下一個yield停止
print(e.send('一盤骨頭'))
相關推薦
Python基礎 迭代器與生成器
Python基礎 迭代器與生成器 迭代器 生成器 迭代器 可迭代物件(iterable) 但凡是可以返回一個迭代器的物件都可稱之為可迭代物件,看個例子
03 - 迭代器與生成器
迭代器與生成器 迭代器 可迭代物件 字串、列表、元組、字典、集合 都可以被for迴圈,說明他們 都是可迭代物件 。 print([1,2].__iter__()) #結果 <list_iterator object at 0x1024784a8
python3_迭代器與生成器__ / __iter__() / __next__() / yield / next() / iter()
1. 可用於for迴圈的資料型別有一下幾種: (1)集合資料型別:list, tuple, dict, set, str, bytes (2)generator(資
python3語言學習筆記(四:迭代器與生成器)
迭代器(iterator)------一種物件 迭代是Python最強大的功能之一,是訪問集合元素的一種方式。 迭代器是一個可以記住遍歷的位置的物件。 迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。 迭代器有兩個基本的方法:iter() 和
Python中的迭代器與生成器
Python中的迭代器與生成器介紹 一、迭代器iterator 迭代器是訪問可迭代物件的工具。 迭代器是指用iter(obj)函式返回的物件 迭代器是可以用next(it)函式獲取可迭代物件的資料 1、迭代器函式 iter()與next()
08-Python基礎之迭代器與生成器
迭代器 可迭代協議:只要含有__iter__方法的都是可迭代的,只要是能被for迴圈的資料型別 就一定擁有__iter__方法 迭代器協議 :內部含有__next__和__iter__方法的就是迭代器 迭代器的好處: 從容器型別中一個一個的取值,會把所有的值都取到 節省記憶體空間,迭代器
python 基礎系列--可迭代物件、迭代器與生成器
迭代器是 Python 最強大的功能之一,可以想像如果有個幾十 GB 的大檔案,你需要編寫程式處理其中的文字資訊,如果一次性全部讀入記憶體,估計機器會直接罷工了,但是借住可迭代物件,可以一次從硬碟讀取一小塊內容到記憶體,處理完後寫回硬碟,不斷迭代,從而節省記憶體,加快處理速度。 首先來解
python學習之路--day12迭代器與生成器
一、迭代器 1.什麼是迭代器 迭代:一個重複的過程,但每次重複都是基於上一次重複的結果而繼續 迭代器就是迭代取值的工具 2.為什麼要用迭代器 對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一
迭代器與生成器
isinstance關鍵字 用來判斷一個物件的變數型別 a=[1,2,3,4,5] print(isinstance(a,list)) >>> True enumerate 函式 用於遍歷序列中的元素以及它們的下標 for i,j in e
這都不會?Python_迭代器與生成器
一. 迭代器 什麼是迭代器: 提供了一個方法,可以不斷獲取物件裡的資料。 使用者不需要關心內部細節,只需要通過這個特定介面獲取資料。 當沒有資料時,再次呼叫時,會得到一個停止標記。 不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問 訪問到一半時不能往回退
python迭代器與生成器差別
生成器是一類特殊的迭代器,在迴圈遍歷自定義容器物件時,會使用python內建函式iter()呼叫遍歷物件的_iter_(self)獲得一個迭代器,之後再迴圈對這個迭代器使用next()呼叫迭代器物件的_next_(self) 實現生成器的功能。 python中生成器和迭代器
python--迭代器與生成器
寫在迭代器之前,假如我要迴圈遍歷一個列表並列印,for迴圈想必是再熟悉不過了 l = [1, 2, 3, 4] for i in l: print(i) 1 2 3 4 然而for迴圈為什麼能迴圈呢,他的內部是如何實現的呢? 迭代器 迭代 可迭代的(
深入理解ES6之迭代器與生成器
迭代器 迭代器 iterator,在 Javascript 中,迭代器是一個物件(也可稱作為迭代器物件),它提供了一個 next() 方法,用來返回迭代序列中的下一項。 next 方法的定義,next 方法是一個函式,執行後返回一個物件包含兩個屬性:{ done: [boolean]
迭代器與生成器(python)簡述
迭代器 迭代是Python最強大的功能之一,是訪問集合元素的一種方式。 迭代器是一個可以記住遍歷的位置的物件。 迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。 迭代器有兩個基本的方法:iter() 和 next()。 字串
迭代器與生成器的使用
友情提示:檢視部落格前,請開啟目錄,查詢內容。感謝您前來參考,希望對您有用 迭代器,迭代的工具 什麼是迭代器? 指的是一個重複的過程,每一次重複稱為一次迭代,並且每一次重複的結果是下
python 迭代器與生成器即迭代協議的特別說明
python 中抽象程度更高,直接在語言層面支援對容器進行迭代。C++ 中在泛型演算法和容器之間還需要藉助中間層迭代器來粘合。 可迭代的是兩類物件: 1、包含 __iter__ 方法的。 2、包含 __getitem__ 方法的。比如 str 物件就沒有 __iter__
python 迭代器與生成器 詳解
在python中,我們經常使用for迴圈來遍歷各種集合,例如最常用的有list,dict等等,這些集合都是可迭代物件。我們先來了解一下python中的迭代器(Iterator)。 一、迭代器 顧名思義,迭代器,自然就是用來做迭代用的(好像是廢話)。以li
為什麼for迴圈可以遍歷list:Python中迭代器與生成器
1 引言 只要你學了Python語言,就不會不知道for迴圈,也肯定用for迴圈來遍歷一個列表(list),那為什麼for迴圈可以遍歷list,而不能遍歷int型別物件呢?怎麼讓一個自定義的物件可遍歷? 這篇部落格中,我們來一起探索一下這個問題,在這個過程中,我們會介紹到迭代器、可迭代物件、生成器,更進一
Python——五分鐘帶你弄懂迭代器與生成器,夯實程式碼能力
本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是週一Python專題,給大家帶來的是Python當中生成器和迭代器的使用。 我當初第一次學到迭代器和生成器的時候,並沒有太在意,只是覺得這是一種新的獲取資料的方法。對於獲取資料的方法而言,我們會一種就足夠了。但是在我後來Pytho
【python】迭代器與生成器到底是什麼?看完你就知道
迭代器跟生成器,與上篇文章講的裝飾器一樣,都是屬於我的一個老大難問題。 通常就是遇到的時候就去搜一下,結果在一大坨各種介紹部落格中看了看,回頭又忘記了。 你是不是也是這樣呢? 俗話說:好記性不如爛筆頭,雖然現在基本不咋用筆寫字了,但是還是要好好整理下,起碼以後我就不用搜了。 如果現在給你一個列表`list