• python之彻底搞懂迭代、可迭代、迭代器。生成器


    一、基本概念

    迭代(Iteration)是动词,是指通过遍历获取某容器内所有元素,特指遍历获取这个动作。

    可迭代 (iterable)是形容词,是指某容器可被遍历获取内部所有元素,特指容器内元素可被遍历获取的特性。

    在python中包含__iter__方法的对象就是可迭代的。

    可迭代对象一般指某容器可被循环遍历获取内部所有元素,该容器有__iter__方法和__getitem__,无__next__方法。可迭代对象常见的有str、list、tuple、set、dict等。

    迭代器 (iterator)名词,特指某种特殊的容器,该容器内所有元素可通过__next__方法依次获取。

    在python中包含__iter__方法和__next__方法的对象就是迭代器。

    • 迭代器一般指某容器可通过__next__方法依次获取内部所有元素,该容器有__iter__方法和__next__,无__getitem__方法。
    • 迭代器常见的有文件句柄以及通过iter()转换的对象和迭代器生成式生成的对象等。

    生成器,是一种特殊的迭代器,生成器自动生成了__iter__方法和__next__,不需要再手动生成:

    使用了 yield 的函数被称为生成器,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

    二、区分可迭代对象与迭代器的方法

    1.判断一个对象是可迭代对象,可以通过查看该对象是不是有__iter__方法和__getitem__方法来鉴别。

    # 字符串:可迭代对象
    s1 = '努力学python,坚持认真学python'
    print('*' * 10, '判断字符串iter、getitem、next', '*' * 10)
    print('iter:', '__iter__' in dir(s1))
    print('getitem:', '__getitem__' in dir(s1))
    print('next:', '__next__' in dir(s1))
    # 列表:可迭代对象
    l1 = [i for i in range(10)]
    print('*' * 10, '判断列表iter、getitem、next', '*' * 10)
    print('iter:', '__iter__' in dir(l1))
    print('getitem:', '__getitem__' in dir(l1))
    print('next:', '__next__' in dir(l1))
    
    out:
    ********** 判断字符串iter、getitem、next **********
    iter: True
    getitem: True
    next: False
    ********** 判断列表iter、getitem、next **********
    iter: True
    getitem: True
    next: False

    2.判断一个对象是不是迭代器,可以通过查看该对象是不是有__iter__方法和__next__方法来鉴别。

    # 字符串迭代器
    s2 = iter(s1)
    print('*' * 10, '判断字符串迭代器iter、getitem、next', '*' * 10)
    print('iter:', '__iter__' in dir(s2))
    print('getitem:', '__getitem__' in dir(s2))
    print('next:', '__next__' in dir(s2))
    # 列表迭代器
    l2 = iter(l1)
    print('*' * 10, '判断列表迭代器iter、getitem、next', '*' * 10)
    print('iter:', '__iter__' in dir(l2))
    print('getitem:', '__getitem__' in dir(l2))
    print('next:', '__next__' in dir(l2))
    
    out:
    ********** 判断字符串迭代器iter、getitem、next **********
    iter: True
    getitem: False
    next: True
    ********** 判断列表迭代器iter、getitem、next **********
    iter: True
    getitem: False
    next: True

    三、可迭代对象与迭代器的优劣比较

    可迭代对象的优点:

    1. 访问速度快。
    2. 访问方式灵活,可多次、重复、任意选择范围访问。
    3. 内置方法和函数比较多。

    缺点:

    1. 耗费内存。
    2. 取值过于灵活(有时会引起报错,如index out of range、TypeError等)。

    迭代器的优点:

    1. 节省内存。
    2. 惰性取值(一次固定取一条数据,直到取值完毕报StopIteration,不会引发报错)。

    缺点:

    1. 访问速度慢。
    2. 访问方式死板,只能访问下一条不能访问上一条。
    3. 内置方法和函数比较少。

    参考:https://www.cnblogs.com/fz17/p/13732964.html

  • 相关阅读:
    MongoDB 2.4、备份
    MongoDB 2.3复制(副本集)
    MongoDB 2.2安全
    isMobile 一个简单的JS库,用来检测移动设备
    修改ECSHOP,支持图片云存储化(分离到专用图片服务器)
    压缩代码加速ecshop程序页面加载速度
    ecshop改造读写分离
    ecshop在nginx下实现负载均衡
    运用@media实现网页自适应中的几个关键分辨率
    在ECSHOP首页今日特价(促销商品)增加倒计时效果
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/13792111.html
Copyright © 2020-2023  润新知