zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/13792111.html
Copyright © 2011-2022 走看看