叠代器、可叠代對象與生成器
阿新 • • 發佈:2018-07-28
for instance ron 地方 我們 app ont generator 大數據
Iterator 與 gerater的作用是優化內存,當處理大文件,大數據的時候可以使用。
1. 對大列表進行優化
2. 大文件的優化
一、基本概念
叠代器: 一種數據類型,用來處理大數據
可叠代對象:一個對象,能每次返回數據組中的一個成員,for循環中每次返回一個數據或者用來作為iter內置函數的參數,返回叠代器對象
生成器: 生成器是通過yield 或 生成器表達式,用一種比較方便的方式生成了叠代器。
二、代碼視線部分
2.1 yield
yield函數就是一個生成器:
yield的作用:
1. 相當於return返回一個值
2. 記住該位置,下次進來從這個位置開始。
兩種使用方式:
1. 使用next 和 send 需結合異常處理(當超出最大值的時候,會報錯)
2. 使用for循環,for內部自動幫我們處理異常
def ge(): yield 8 yield 88 yield 888 g = ge() print(next(g)) print(next(g)) print(next(g)) print(next(g)) # 報錯,超出
使用for處理
def gen_num2(): for i in range(8): # range是一個惰性機制。 yieldi for i in gen_num2(): print(i)
2.2 叠代器,可叠代對象,生成器的類型判斷
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是一個可叠代對象,不是叠代器。但是他跟叠代器有類似的地方,又一個惰性機制,所有也很節約內存 r = range(10) print(type(r)) print(isinstance(r, Iterable)) # True print(isinstance(r, Iterator)) # False print(isinstance(r, Generator)) # False # 文件對象 是一個叠代器 with open(‘1.txt‘, ‘wb‘) as f: pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False # yield對象 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)) # False
2.3 可叠代對象轉換為叠代器,優化內存
使用iter內置函數
from collections import Generator, Iterable, Iterator x = [x for x in range(10)] y = iter(x) # 列表轉換為叠代器 print(next(y)) print(next(y)) print(next(y)) print(next(y)) print(isinstance(y, Iterable)) print(isinstance(y, Iterator)) # 是叠代器對象, print(isinstance(y, Generator)) dic = {‘name‘:‘hui‘, ‘age‘:18} print(isinstance(dic, Iterable)) print(isinstance(dic, Iterator)) print(isinstance(dic, Generator)) d = iter(dic) # 字典轉換為叠代器 print(type(d)) print(isinstance(d, Iterable)) print(isinstance(d, Iterator)) print(isinstance(d, Generator))
2.4 生成器表達式
# 列表表達式 y = [x for x in range(10)] # 生成器表達式 z = (x for x in range(10)) print(type(z), z)
2.5 大文件 與 函數優化
1. 函數優化
# 斐波那契 # 0,1,1,2,3 def fb(n): a, b = 0, 1 while a < n: print(a) a,b = b, a+b def fb_list(n): a, b = 0, 1 fblist = [] while a < n: fblist.append(a) # 當數據量非常大的時候,就會造成內存爆炸 a, b = b, a+b return fblist print(fb_list(1000)) def fb_ge(n): a, b = 0, 1 fblist = [] while a < n: yield a # 使用生成器每次來取,優化內存 a, b = b, a+b for i in fb_ge(1000): print(i, end=‘ ‘)
2. 大文件優化
打開文件的對象,本身就是一個叠代器。
with open(‘1.txt‘, ‘wb‘) as f: pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False
叠代器、可叠代對象與生成器