可迭代和迭代器

原文参考:https://baijiahao.baidu.com/s?id=1605521786183411929&wfr=spider&for=pc

可迭代:在Python中如果一个对象有iter( )方法或getitem( )方法,则称这个对象是可迭代的(Iterable);其中iter( )方法的作用是让对象可以用for ... in循环遍历,getitem( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。换句话说,两个条件只要满足一条,就可以说对象是可迭代的。显然列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的。当然因为Python的“鸭子类型”,我们自定义的类中只要实现了iter( )方法或getitem( )方法,也是可迭代的。

class Weather():
    def __init__(self, citys):
        self.citys = citys
    def __iter__(self):
        return iter(self.citys)
wea = Weather(['苏州', '兰州', '西安'])
for x in wea:
    print(x)

迭代器:在Python中如果一个对象有iter( )方法和next( )方法,则称这个对象是迭代器(Iterator);其中iter( )方法是让对象可以用for ... in循环遍历,next( )方法是让对象可以通过next(实例名)访问下一个元素。注意:这两个方法必须同时具备,才能称之为迭代器。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。

class WeatherIterable():
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def __iter__(self):
        return iter(self.cities)

    def __next__(self):
        if self.index == len(self.cities):
            raise StopIteration
        res = self.cities[self.index]
        self.index += 1
        return res

if __name__ == "__main__":
    a = WeatherIterable(['上海', '北京', '厦门'])
    while True:
        print(next(a))
        sleep(1)

通过对定义的分析和比较我们得知:迭代器都是可迭代的,但可迭代的不一定是迭代器;可用for ... in循环的都是可迭代的,可用next( )遍历的才是迭代器;next( )是单向的,一次只获取一个元素,获取到最后一个元素后停止;在可迭代的对象中提前存储了所有的元素,而迭代器是惰性的,只有迭代到了某个元素,该元素才会生成,迭代之前元素可以是不存在的,迭代之后元素也可以被销毁,因此迭代器在处理大量数据甚至无限数据时具有加载数据快、占用内存小等优势。

判断对象是否为可迭代对象,可迭代器对象:

from collections import Iterable, Iterator
isinstance(x, Iterable)          
isinstance(x, Iterator)          

生成器函数:定义生成器函数generator与定义普通函数是一样的,唯一的不同生成器函数中有一个或多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,而yield将数据返回后仍然继续运行函数,因此最后生成器函数返回的是一个迭代器对象。下图的代码定义了一个生成器函数用于对字符串的顺序进行翻转。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容