8 迭代器和生成器

2021-08-20 11:17:11 字數 2954 閱讀 3385

# iterable 可迭代

中有__iter__

# 而iterator迭代器

繼承類iterable 並有魔法方法__next__

>>>

from collections.abc import iterable, iterator

>>> a = [1, 2]

>>> print(isinstance(a, iterable)) # a是可迭代的

true

>>> print(isinstance(a, iterator)) # a不是迭代器

false

# 把a變為迭代器

>>> iterator = iter(a)

>>> print(isinstance(iterator, iterator))

true

>>> 

from collections.abc import iterator

# company 是乙個迭代器,

但是它的__next__魔法函式

並不在自己內部寫。

# 把__next__寫在myiterator中,index索引就不用在company內部做了。

更符合編碼規範

>>>

class

company:

>>>

def__init__

(self, employee_list):

>>> self.employee = employee_list

>>>

def__iter__

(self):

# for in 結構時

呼叫》

return myiterator(self.employee)

>>>

def__getitem__

(self, item):

# company[1] 角標索引時

呼叫》

return self.employee[item]

>>>

class

myiterator

(iterator):

# 繼承iterator 不需要寫 __iter__

>>>

def__init__

(self, employee_list):

>>> self.iter_list = employee_list

>>> self.index = 0

# 生成器的魔法方法

>>>

def__next__

(self):

# 真正返回迭代值的邏輯

>>>

try:

>>> word = self.iter_list[self.index]

>>>

except indexerror:

>>>

raise stopiteration

>>> self.index += 1

>>>

return word

>>>

if __name__ == '__main__':

>>> company = company(['tom', 'bob', 'jane'])

>>> print(company[1])

bob>>>

for item in company:

>>> print(item)

tombob

jane

>>> 

defgen_fib

(index):

>>> n, a, b = 0, 0, 1

>>>

while n < index:

>>>

yield b

>>> a, b = b, a+b

>>> n += 1

>>>

if __name__ == '__main__':

>>>

for fib in gen_fib(6):

>>> print(fib)11

2358

目的:500g 的大檔案, 一行一行讀取, 再寫入資料庫.

困難:但大檔案的所有行 都是寫在了同一行上,行與行 之間以'' 隔開,常規方法不可用了。

我們需要針對這種情況 用yield實現讀取大檔案

def

myreadlines

(f, newline):

# f檔案指標, newline行與行的分隔符

buf = ""

# 快取

while

true:

while newline in buf: # buf中有分隔符,就不停迴圈

pos = buf.index(newline) # 找到快取中

分隔符的位置

yield buf[:pos] # 分隔符前的資料 yield出去

buf = buf[pos + len(newline):] # buf更新, yield過的,丟棄

chunk = f.read(4096) # 每次讀入4096個字元

ifnot chunk:

yield buf

break

buf += chunk

with open("sourcefile.txt") as f:

for line in myreadlines(f, ""):

print(line)

生成器和迭代器

可以直接作用於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...