1. 程式人生 > >迭代器與生成器的使用

迭代器與生成器的使用

友情提示:檢視部落格前,請開啟目錄,查詢內容。感謝您前來參考,希望對您有用

迭代器,迭代的工具

什麼是迭代器?

指的是一個重複的過程,每一次重複稱為一次迭代,並且每一次重複的結果是下一次重複的初始值

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