迭代器和生成器,使用生成器讀取大檔案

2021-09-10 02:31:12 字數 4373 閱讀 3518

# 可迭代型別 和 迭代器

"""什麼是迭代協議。

迭代器是什麼?

是訪問集合類的一種方式,一般用來遍歷資料。

for迴圈可以遍歷資料

迭代器和以下標的訪問方式不一樣,迭代器是不能返回的(後退)

alist[0] alist[2] alist[1] 是不行的

[ ]下標訪問 背後的原理/協議 是 __getitem__

迭代器提供了一種惰性訪問資料的方式

__iter__

"""from collections.abc import iterable,iterator

"""iterable:__iter__

iterator:迭代器 繼承iterable, __iter__ __next__

"""list

# 只實現了__iter__,沒有實現__next__

a =[1,

2]print

(isinstance

(a,iterable)

)print

(isinstance

(a,iterator)

)

from collections.abc import iterable,iterator

a =[1,

2]print

(isinstance

(a,iterable)

)print

(isinstance

(a,iterator)

)iter_rator =

iter

(a)print

(isinstance

(iter_rator,iterable)

)print

(isinstance

(iter_rator,iterator)

)"""

iter(傳入乙個可迭代物件)

返回乙個迭代器

換乙個說法

iter(傳入乙個實現__iter__的物件)

返回乙個是實現了 __iter__ __next__的物件

"""

class

company

(object):

def__init__

(self, employee_list)

: self.employee = employee_list

def__iter__

(self)

:yield

1yield

2yield

3# return iter([1,2,3,4])

def__getitem__

(self, item)

:return self.employee[item]

if __name__ ==

"__main__"

: company = company(

["tom"

,"bob"

,"jane"])

for i in company:

print

(i)"""

for迴圈 會去company 尋找__iter__協議,如果沒有,退而求其次,選擇 __getitem__

如果有iter,則會去選擇__iter__

"""

from collections.abc import iterator

class

myiterator

(iterator)

:"""

自定義的迭代器類

"""def__init__

(self, employee_list)

: self.iter_list = employee_list

self.index =

0def

__next__

(self)

:#真正返回迭代值的邏輯

try:

word = self.iter_list[self.index]

except indexerror:

raise stopiteration

self.index +=

1return word

class

company

(object):

""" 使用自己的迭代器類

"""def__init__

(self, employee_list)

: self.employee = employee_list

def__iter__

(self)

:return myiterator(self.employee)

if __name__ ==

"__main__"

: company = company(

["tom"

,"bob"

,"jane"])

my_itor =

iter

(company)

for item in company:

print

(item)

def

gen_func()

:yield

1yield

2yield

3def

func()

:return

1return

2gen = gen_func(

)# 返回的是乙個生成器物件

res= func(

)# 返回的是1這個值

for i in gen:

print

(i)"""

生成器物件,python編譯位元組碼的時候就產生了,它發現了yield

""""""

惰性求值,延遲求值提供了可能

斐波那契

0 1 1 2 3 5 8

"""def

fib(index)

:"""

列印 斐波那契10位數

"""if index <=2:

return

1else

:return fib(index-1)

+fib(index-2)

print

(fib(10)

)def

fib2

(index)

: re_list =

n,a,b =0,

0,1while na,b=b,a+b

n+=1return re_list

print

(fib2(10)

)# 使用生成器實現斐波那契

deffib3

(index)

: n,a,b =0,

0,1while nyield b

a,b=b,a+b

n+=1for data in fib3(10)

:print

(data)

"""

讀取乙個500g的檔案

f=open()

for line in f: 按照行讀

如果這個500g檔案只有一行,特殊分隔符

f = open()

f.read(4096) # 只有讀出4096個字元

f.read(4096)

"""#500g, 特殊 一行

defmyreadlines

(f, newline)

:"""

:param f: 檔案控制代碼

:param newline:分隔符

"""buf =

""#快取,用來已經讀出的資料量

while

true

:while newline in buf:

#查詢快取中的資料是否包含分隔符

#如果存在 我們會把分隔符的位置找到

pos = buf.index(newline)

yield buf[

:pos]

buf = buf[pos +

len(newline):]

# setp1 讀取4096個字元

chunk = f.read(

4096)if

not chunk:

#說明已經讀到了檔案結尾

yield buf

break

buf += chunk

with

open

("input.txt"

)as f:

for line in myreadlines(f,"")

:print

(line)

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...

迭代器 生成器

迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...