# 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...