# 可迭代型別 和 迭代器
"""什麼是迭代協議。
迭代器是什麼?
是訪問集合類的一種方式,一般用來遍歷資料。
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...