迭代器vs可迭代對象,生成式vs生成器,推導式
迭代器vs可迭代對
-
迭代器(類):凡是實現了__iter__,__next__的對象就是迭代器。
-
可迭代對象:只實現了__iter__方法
例子:手寫迭代器,實現Range()函數
class Range:
def __init__(self, start, stop=None, step=1):
if stop is None:
# 說明沒有傳start的值.
self.start = 0
self.stop = start
else:
self.start = start
self.stop = stop
self.step = step
def __iter__(self):
return self
def __next__(self):
# 返回當前值,並更新下一個值
if self.start < self.stop:
temp = self.start
self.start += self.step
return temp
else:
raise StopIteration
注意:
1)iter方法,什麼都不用做,返回它自己
2)next函數,返回當前值,並更新下一個。不滿足條件時拋出StopIteration
例子2:使用迭代器實現斐波那契數列
"""
使用迭代器實現斐波那契數列
"""
class Fab:
def __init__(self, n):
self.prev = 0
self.curr = 1
self.times = 0
self.stop = n
def __iter__(self):
return self
def __next__(self):
if self.times <= self.stop:
# 更新
temp = self.curr
self.prev, self.curr = self.curr, self.prev + self.curr
self.times += 1
return temp
else:
raise StopIteration
注意:
1)iter 永遠只返回自己
2)因爲每次都會調用__next__ ,所以裏面不用循環
推導式(生成式) vs 生成器
-
推導式(生成式)
-
一行代碼實現for循環
-
從一個數據序列構建另一個新的數據序列的結構體
-
有三種: 列表,字典,集合。分三部分:“生成值的表達式”, “循環主體”, “過濾條件表達式”
列表: [i * 3 for i in range(5) if i % 2 == 0] 字典: {i: i + 3 for i in range(5)} 集合: {i for i in range(5)} #列表生成式 lis = [x*x for x in range(10)]
-
-
生成器(函數)
-
特殊的迭代器(不需要自己實現iter和next方法,每次調用yield會暫停,而可以使用next()函數和send()函數恢復生成器)
-
函數種含有yield關鍵字
-
“惰性求值”(節省內存)一邊循環一邊計算的機制
-
最簡單創建:把推導式種的【】變()
#生成器 generator_ex = (x*x for x in range(10))
-
例子:使用生成器生成斐波那契數列
"""
使用生成器生成斐波那契數列
"""
def fab(n):
prev, curr = 0, 1
times = 0
while True:
if times <= n:
# 迭代
temp = curr
prev, curr = curr, curr + prev
times += 1
yield temp
else:
break
or