zoukankan      html  css  js  c++  java
  • 迭代器

    前言

    使用for循环去遍历序列,但是for循环的效率很低,而且占用了大量的硬件资源。

    生成器可以提高for循环遍历效率,而且节省硬件资源。

    一、可迭代对象

    1、for循环数据类型

    (1)集合数据类型,如:list(列表)、tuple(元祖)、dict(字典)、set(集合)、str(字符串)、bytes(字节)等。

    (2)生成器(generator),包括生成器和带yield的生成器函数。

    2、可迭代对象(Iterable):直接用于for循环遍历数据的对象。

    3、用isinstance()方法判断一个对象是否是Iterable对象

    >>> from  collections import  Iterable
    __main__:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
    >>> isinstance([],Iterable)
    True
    >>> isinstance((),Iterable)
    True
    >>> isinstance(100,Iterable)
    False
    >>> isinstance('a',Iterable)
    True
    

    生成器不但可以作用于for循环,还可以被__next__()函数不断调用,并且返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值而抛出的异常。

    二、迭代器

    1、定义

    迭代器(Iterator):可以用__next__()函数调用并不断的返回下一个值的对象称为迭代器。

    2、用isinstance()方法判断一个对象是否是Iterator对象

    >>> from  collections import  Iterator
    >>> isinstance({},Iterator)
    False
    >>> isinstance([],Iterator)
    False
    >>> isinstance((i+2 for i in range(5)),Iterator)#生成器
    True
    >>> isinstance('hhsh',Iterator)
    False
    

    生成器都是Iterator对象,但是list、dict、str虽然是Iterable对象,却不是Iterator对象。

    因为python的Iterator对象表示的是一个数据流,Iterator对象可以被__next__()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过__next__()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。

    所以Iterator甚至可以表示一个无限大的数据流,例如:全体自然数。而使用list是永远不可能存储全体自然数的。

    3、iter()函数

    iter()函数可以把list、dict、str等Iterable对象变成Iterator对象。

    >>> isinstance(iter('hhsh'),Iterator)
    True
    >>> isinstance(iter({}),Iterator)
    True
    >>> isinstance(iter([]),Iterator)
    true

    4、rang()方法

    在python2.7中rang()只是一个list,在python3中是一个迭代器,python2.7中xrange()跟python3中的range()功能是一样的。

    >>> range(5)
    range(0, 5)
    

     运行原理:

    x = iter([1,2,3,4,5])
    # 首先获得Iterator对象
    while True:
        # 循环
        try:
            i = next(x)
            # 获得下一个值
        except StopIteration:
            # 遇到StopIteration就退出循环
            break
    

      总结

    1. 凡是可以作用于for循环的对象都是Iterable类型。
    2. 凡是作用于__next__()函数的对象都是Iterator类型,它们表示一个惰性计算的序列。
    3. 集合数据类型,例如:list、dict、str等,是Iterable但不是Iterator
    4. 集合数据类型可以通过iter()函数获得一个Iterator对象。
     
  • 相关阅读:
    PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
    PAT 甲级 1050 String Subtraction (20 分) (简单送分,getline(cin,s)的使用)
    PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***...
    PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)
    PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)...
    PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)
    R语言实现金融数据的时间序列分析及建模
    ES6 | class类的基本语法总结
    less使用总结
    umi 的项目中如何修改 favicon
  • 原文地址:https://www.cnblogs.com/bianfengjie/p/10845521.html
Copyright © 2011-2022 走看看