迭代器有兩個重要部分
1._iter_()
用來獲取迭代器物件
2.next()
獲取容器內下乙個元素
斐波列數列 1 1 2 3 5 8 等於前兩個數相加。
class
fab(object):
#建構函式
def__init__
(self,max):
self.max =max
self.n, self.a, self.b = 0, 0, 1
def__iter__
(self):
return self
def__next__
(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b,self.a + self.b
self.n +=1
return r
raise stopiteration() #迭代器沒有更多的值了,異常處理
如果我們要寫乙個斐波列數列的函式
第一次寫可能是這樣的
def
fab(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a+b
n = n +1
沒有返回值,使用print,不能讓其他函式使用,
第二次,返回乙個列表
def
fab(max):
n, a, b = 0, 0, 1
list =
while n < max:
list[n] = b
a, b = b, a+b
n = n +1
但是如果max = 1000000000能 記憶體豈不**?
第三次
我們就考慮使用迭代器了
class
fab(object):
#建構函式
def__init__
(self,max):
self.max =max
self.n, self.a, self.b = 0, 0, 1
def__iter__
(self):
return self
def__next__
(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b,self.a + self.b
self.n +=1
return r
raise stopiteration() #迭代器沒有更多的值了,異常處理
x = fab(5)
for i in x:
print(i)
這樣的話,記憶體占用一直是乙個常數,但是這第三次的**和第一次的**比起來,好長。
簡化之,使用yield
第四次
def
fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n = n +1
x = fab(5)
for i in x:
print(i)
不能直接print yield型別的值 否則會輸出乙個 Python 3 x自定義迭代器物件
python 3.x與python 2.x之間存在著較多的語法細節差異。今天在看python核心程式設計的時候,說到了自定義迭代器物件。於是動手將原始碼打了一遍,原書 如下 class anyiter object def init self,data,safe false the initiali...
Python3 x基礎學習 裝飾器
1.裝飾器函式的本質 乙個閉包函式 2.裝飾器函式的作用 在不修改原函式及其呼叫方式的情況下對原函功能進行擴充套件 3.語法格式 裝飾器名稱 def foo print foo foo 公司有n個部門,每個部門負責相應的業務 deff1 print 身份驗證 print f1 def f2 prin...
Python3 x編碼問題
1.記事本的ansi編碼為系統本地編碼,我的是gbk open 函式的encoding引數預設是本地編碼,也就是gbk,所以直接讀取ansi編碼的記事本檔案是木有問題的。怎麼檢視系統本地編碼?在cmd下輸入 chcp 從下表可以看出,936對應gbk編碼 下表列出了所有支援的 頁及其國家 地區 或者...