內(nèi)容來源于網(wǎng)絡,本人只是在此稍作整理,如有涉及版權(quán)問題炮叶,歸小甲魚官方所有答朋。
練習題(來自小甲魚官方論壇)
0.請用你的話解釋一下“迭代”的概念贷揽。
答:迭代是重復反饋過程的活動,其目的通常是為了接近并到達所需的目標或結(jié)果梦碗。每一次對過程的重復被稱為一次迭代禽绪,而每一次迭代得到的結(jié)果會被用來作為下一次迭代的初始值。
1.迭代器是一個容器嗎洪规?
答:不是印屁。因為我們耳熟能詳?shù)娜萜飨窳斜怼⒆值湔独⒃M都是可以存放數(shù)據(jù)的雄人,而迭代器就是實現(xiàn)了__ next__()方法的對象(用于遍歷容器中的數(shù)據(jù))。
2.迭代器可以回退(獲取上一個值)嗎?
答:迭代器性質(zhì)決定沒有辦法回退础钠,只能往前進行迭代恰力。但這并不是什么很大的缺點,因為我們幾乎不需要再迭代途中進行回退操作旗吁。
3.如何快速判斷一個容器是否具有迭代功能踩萎?
答:判斷該容器是否擁有__ iter__()和__ next__()魔法方法。
5.在Python原生支持的數(shù)據(jù)結(jié)構(gòu)中很钓,你知道哪一個是只能用迭代器訪問的嗎香府?
答:對于原生支持隨機訪問的數(shù)據(jù)結(jié)構(gòu)(如tuple、list)码倦,迭代器和經(jīng)典for循環(huán)的索引訪問相比并無優(yōu)勢企孩,反而丟失了索引值(可以使用內(nèi)建函數(shù)enumerate()找回這個索引值,這是后話)袁稽。但對于無法隨機訪問的數(shù)據(jù)結(jié)構(gòu)(比如set)而言柠硕,迭代器是唯一的訪問元素的方式。
編程題
0.用while語句實現(xiàn)以下for 語句相同的功能:
for each in range(5):
print(each)
答:
alist = range(5)
it = iter(alist)
while True:
try:
print(next(it))
except StopIteration:
break
1.寫一個迭代器运提,要求輸出至今為止的所有閏年蝗柔。如:
答:
import datetime as dt
class LeapYear:
def __init__(self):
self.now = dt.date.today().year
def isLeapYear(self, year):
if (year%4 == 0 and year%100 != 0) or (year%400 == 0):
return True
else:
return False
def __iter__(self):
return self
def __next__(self):
while not self.isLeapYear(self.now):
self.now -= 1
temp = self.now
self.now -= 1
return temp
ly = LeapYear()
for i in ly:
if i > 2000:
print(i)
else:
break
輸出:
2016
2012
2008
2004
2.要求自己寫一個MyRev類,功能與reversed()相同(內(nèi)置函數(shù)reversed(seq)民泵,是返回一個迭代器癣丧,是序列seq的逆序顯示)。例如:
>>> myRev = MyRev("FishC")
>>>for i in myRev:
print(i, end=' ')
答:代碼如下
class MyRev:
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
myRev = MyRev("FishC")
for i in myRev:
print(i, end=' ')
3.請寫下這一節(jié)課你學習到的內(nèi)容:格式不限栈妆,回憶并復述是加強記憶的好方式胁编!
- 迭代器的魔法方法
__ iter__():返回迭代器本身;
__ next__():這里寫迭代的規(guī)律鳞尔。
舉個例子:
class Fibs:
def __init__(self, n=20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n:
raise StopIteration
return self.a
fibs = Fibs(20)
for each in fibs:
print(each)
輸出:
1
1
2
3
5
8
13