1. 程式人生 > >叠代器、可叠代對象與生成器

叠代器、可叠代對象與生成器

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是一個惰性機制。
        yield
i 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

叠代器、可叠代對象與生成器