迭代器、可迭代对象与生成器
Iterator 與 gerater的作用是優(yōu)化內(nèi)存,當(dāng)處理大文件,大數(shù)據(jù)的時(shí)候可以使用。
1. 對(duì)大列表進(jìn)行優(yōu)化
2. 大文件的優(yōu)化
一、基本概念
迭代器: 一種數(shù)據(jù)類型,用來(lái)處理大數(shù)據(jù)
可迭代對(duì)象:一個(gè)對(duì)象,能每次返回?cái)?shù)據(jù)組中的一個(gè)成員,for循環(huán)中每次返回一個(gè)數(shù)據(jù)或者用來(lái)作為iter內(nèi)置函數(shù)的參數(shù),返回迭代器對(duì)象
生成器: 生成器是通過yield 或 生成器表達(dá)式,用一種比較方便的方式生成了迭代器。
二、代碼視線部分
2.1? yield?
?yield函數(shù)就是一個(gè)生成器:
yield的作用:
1. 相當(dāng)于return返回一個(gè)值
2. 記住該位置,下次進(jìn)來(lái)從這個(gè)位置開始。
兩種使用方式:
1. 使用next 和 send 需結(jié)合異常處理(當(dāng)超出最大值的時(shí)候,會(huì)報(bào)錯(cuò))
2. 使用for循環(huán),for內(nèi)部自動(dòng)幫我們處理異常
def ge():yield 8yield 88yield 888g = ge() print(next(g)) print(next(g)) print(next(g)) print(next(g)) # 報(bào)錯(cuò),超出使用for處理
def gen_num2():for i in range(8): # range是一個(gè)惰性機(jī)制。yield ifor i in gen_num2():print(i)?
2.2 迭代器,可迭代對(duì)象,生成器的類型判斷
from collections import Iterator, Iterable, Generator# 列表的類型判斷 li = [1, 2, 3, 4] print(isinstance(li, Iterable)) # True print(isinstance(li, Iterator)) # False print(isinstance(li, Generator)) # False# 字典的類型判讀 dic = {'name':'hui', 'age':18} print(isinstance(dic, Iterable)) # True print(isinstance(dic, Iterator)) # False print(isinstance(dic, Generator)) # False# range的類型判斷 # range是一個(gè)可迭代對(duì)象,不是迭代器。但是他跟迭代器有類似的地方,又一個(gè)惰性機(jī)制,所有也很節(jié)約內(nèi)存 r = range(10) print(type(r)) print(isinstance(r, Iterable)) # True print(isinstance(r, Iterator)) # False print(isinstance(r, Generator)) # False# 文件對(duì)象 是一個(gè)迭代器 with open('1.txt', 'wb') as f:pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False# yield對(duì)象 def ge():for i in range(9):yield(i) g = ge() print(isinstance(g, Iterable)) # True print(isinstance(g, Iterator)) # True print(isinstance(g, Generator)) # False2.3 可迭代對(duì)象轉(zhuǎn)換為迭代器,優(yōu)化內(nèi)存
使用iter內(nèi)置函數(shù)
from collections import Generator, Iterable, Iteratorx = [x for x in range(10)] y = iter(x) # 列表轉(zhuǎn)換為迭代器 print(next(y)) print(next(y)) print(next(y)) print(next(y)) print(isinstance(y, Iterable)) print(isinstance(y, Iterator)) # 是迭代器對(duì)象, print(isinstance(y, Generator))dic = {'name':'hui', 'age':18} print(isinstance(dic, Iterable)) print(isinstance(dic, Iterator)) print(isinstance(dic, Generator))d = iter(dic) # 字典轉(zhuǎn)換為迭代器 print(type(d)) print(isinstance(d, Iterable)) print(isinstance(d, Iterator)) print(isinstance(d, Generator))?
2.4 生成器表達(dá)式
# 列表表達(dá)式 y = [x for x in range(10)]# 生成器表達(dá)式 z = (x for x in range(10)) print(type(z), z)?
2.5 大文件 與 函數(shù)優(yōu)化
1. 函數(shù)優(yōu)化
# 斐波那契 # 0,1,1,2,3 def fb(n):a, b = 0, 1while a < n:print(a)a,b = b, a+bdef fb_list(n):a, b = 0, 1fblist = []while a < n:fblist.append(a) # 當(dāng)數(shù)據(jù)量非常大的時(shí)候,就會(huì)造成內(nèi)存爆炸a, b = b, a+breturn fblistprint(fb_list(1000))def fb_ge(n):a, b = 0, 1fblist = []while a < n:yield a # 使用生成器每次來(lái)取,優(yōu)化內(nèi)存a, b = b, a+bfor i in fb_ge(1000):print(i, end=' ')2. 大文件優(yōu)化
打開文件的對(duì)象,本身就是一個(gè)迭代器。
with open('1.txt', 'wb') as f:pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False?
?
轉(zhuǎn)載于:https://www.cnblogs.com/louhui/p/9381668.html
總結(jié)
以上是生活随笔為你收集整理的迭代器、可迭代对象与生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纷享车链AutoChain首创之数据保险
- 下一篇: HDU 6301.Distinct Va