python3 迭代器與生成器

迭代器

使用迭代器可以很方便地進行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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章