迭代器和生成器

2022-08-10 08:00:09 字數 3699 閱讀 5647

一、迭代器

1、可迭代物件——iterable

(1)判斷是否可迭代的方法:

from collections import iterable

print(isinstance('aaa',iterable) #輸出結果:true

print(isinstance(123,iterable) #輸出結果:false

print(isinstance([1,2,3],iterable) #輸出結果:true

常見的可迭代物件有:字串、列表、元組、字典、集合、檔案控制代碼、range()

(2)可迭代協議

包含『__iter__'方法的資料型別就是可迭代的。輸出資料型別所有方法的方式如下:

#例項:求出兩個不同資料型別的方法的不同

difference=set(dir([1,2,3]))-set(dir(123)) #dir()方法以列表形式列出資料的所有的方法

print(diffenrence)

2、迭代器——iterator

(1)判斷迭代器的方法

from collections import iterator

iterator_lst=[1,2,3].__iter__()

print(isinstance(itertor_lst,iterator) #輸出結果為:true

print(isinstance([1,2,3],iterator) #輸出結果為:false

(2)迭代器協議

迭代器中有'__next__'和'__iter__'方法

(3)常見迭代器

a.先天的:檔案控制代碼;b後天的:從可迭代物件轉變,格式為:「可迭代物件.__iter__()」

(4)迭代器取值

lst_iterator=[1,2,3].__iter__()

print(lst_iterator.__next__()) #輸出結果為:1

print(lst_iterator.__next__()) #輸出結果為:2

print(lst_iterator.__next__()) #輸出結果為:3

#超過迭代器中的內容就會報錯:stopiterator

(5)優點

a.能對python資料型別進行遍歷,不關心每乙個值;b.可以節省空間:惰性計算

3、二者的區別

(1)可迭代物件包含迭代器;(2)迭代器=可迭代物件.__iter__();(3)可以對可迭代物件和迭代器進行迴圈

二、生成器

1、定義:生成器就是迭代器,生成器是我們自己寫出來的

2、生成器函式:帶有關鍵字yield/yield from的函式就稱為生成器函式

(1)生成器函式在執行時候只返回乙個生成器,不執行生成器函式中的內容

def generator():

print(123)

yield 』aaa『

g=generator()

(2)從生成器中取值

a.生成器.__next__():生成器函式中有幾個yield,就可以取幾次

def generator():

print(123)

yield 'aaa'

print(456)

yield 'bbb'

g=generator()

print(g.__next__()) #輸出結果:123 aaa

print(g.__next__()) #輸出結果:456 bbb

def generator():

print(123)

yield 'aaa'

print(456)

yield 'bbb'

print(generator().__next__()) #輸出結果:123 aaa

print(generator().__next__()) #輸出結果:123 aaa

注意:前者為建立乙個生成器,後者為每次重新建立乙個生成器

b.for迴圈取值

#例項1:

def generator():

print(123)

yield 'aaa'

print(456)

yield 'bbb'

g=generator()

for i in g:

print(i)

#例項2:

def generator():

for i in range(1,50000):

yield i

g=generator()

for j in g:

print(j)

if j==555:

break

c. list(生成器函式) 返回乙個列表,裡面裝著生成器中的所有內容

def generator():

yield 'aaa'

yield 'bbb'

g=generator()

print(list(g)) #輸出結果為:[aaa,bbb]

三、生成器例項

1、yield from例項

def generator():

yield from [1,2,3]

yield from 'abc'

g=generator()

for i in g:

print(i)

****************************************等價於*****************************************

def generator():

for i in [1, 2, 3]:

yield i

for j in 'abc':

yield j

g = generator()

for i in g:

print(i)

2、監控檔案中寫入的內容

import time

def generator(filename):

f=open(filename,encoding='utf-8')

f.seek(0,2)

while true:

line=f.readline()

if not line:

time.sleep(0.1)

continue

yield line

g=generator('demo')

for line in g:

print(line,end='')

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...