迭代器
使用迭代器可以很方便地進行for循環獲取對象中的數據
實現__iter__()、__next__()方法,用於返回迭代的對象和元素。iter()可以將可迭代對象轉換爲迭代器
反向迭代器需要實現__reversed__()接口
使用for循環迭代天氣類,獲取城市列表中的天氣信息
import requests
class Weather:
def __init__(self, cities_name):
self.cities_name = cities_name
self.index = 0
def __iter__(self):
return self
def __next__(self):
size = len(self.cities_name)
if self.index == size:
raise StopIteration
else:
city_name = self.cities_name[self.index]
self.index += 1
return self.get_weather(city_name)
def get_weather(self, city_name):
url = 'http://wthrcdn.etouch.cn/weather_mini?city={}'.format(city_name)
r = requests.get(url).json()
if r['desc'] != 'OK':
return r['desc']
else:
return '{}{}{}'.format(city_name, format(r['data']['forecast'][0]['high'], '^10'),
format(r['data']['forecast'][0]['low'], '^10'))
if __name__ == '__main__':
for w in Weather(['北京', '上海', '武漢', '九江', '江西']):
print(w)
run
北京 高溫 18℃ 低溫 8℃
上海 高溫 20℃ 低溫 13℃
武漢 高溫 22℃ 低溫 12℃
九江 高溫 21℃ 低溫 12℃
invilad-citykey
反向迭代器
class FloatRange:
def __init__(self, start, end, step=0.1):
self.start = start
self.end = end
self.step = step
def __iter__(self):
res = self.start
while res <= self.end:
yield res
res += self.step
def __reversed__(self):
"""
反向迭代器的接口
:return:
"""
res = self.end
while res >= self.start:
yield res
res -= self.step
fr = FloatRange(1.0, 5.0, 0.5)
for e in fr:
print('{:.2f}'.format(e), end=' ')
print()
for e in reversed(fr):
print('{:.2f}'.format(e), end=' ')
print()
生成器
帶有yield的函數被認爲是生成器函數,將會被解釋成可迭代器對象。程序執行到yield的時候將會被暫停,再次被迭代的時候,將會從上次執行的位置繼續
def fib(max_val):
a, b = 0, 1
while a < max_val:
yield a # 函數執行這裏之後,將會暫時停止,返回a, 並等待下一次的迭代
a, b = b, a + b
if __name__ == "__main__":
for e in fib(100): # 迭代生成器對象
print(e, end=" ")
print()