• Python中可迭代对象,迭代器和生成器的异同点


      参考:https://blog.csdn.net/SL_World/article/details/86507872

      解释之前,我们先来看一张概览图,下面是一张关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)、生成器函数和生成器表达式的概览图。

       翻译一下

       它们的从属关系如下

       一,容器(container)

      【概述】:容器就是一个用来存储多个元素的数据结构

      【特点】:

      ①容器中的元素可通过迭代获取。

      ②所有容器中的元素被存储在内存中。

      【举例】:以下都是常见容器对象,他们都可以通过迭代获取,所以它们也是可迭代对象(Iterable),我们暂且理解可迭代对象就是可以被迭代获取的对象。(注:并非所有容器对象都是可迭代对象)

      首先引入如下模块

    # 可迭代对象
    from collections import Iterable
    # 迭代器
    from collections import Iterator
    

      1,列表(list)

    # 列表list是可迭代对象,但是不是迭代器
    title = ['Python','Java','C++']
    for i in title:
        print(i)
    # Python
    # Java
    # C++
    print(isinstance(title,Iterable))
    # True
    print(isinstance(title,Iterator))
    # False
    

      2,元组(tuple)

    # 元组teple是可迭代对象,但是不是迭代器
    title = ('Python','Java','C++')
    for i in title:
        print(i)
    # Python
    # Java
    # C++
    print(isinstance(title,Iterable))
    # True
    print(isinstance(title,Iterator))
    # False
    

      3,字典(dict)

      注:此处打印的字典中的key而不是value

    # 字典是可迭代对象,但是不是迭代器
    title = {'Python':3,'Java':1.9,'C++':2}
    for key in title:
        print(key)
    # Python
    # Java
    # C++
    print(isinstance(title,Iterable))
    # True
    print(isinstance(title,Iterator))
    # False
    

      4,集合(set)

    # 集合set是可迭代对象,但是不是迭代器
    title = {'Python','Java','C++'}
    for i in title:
        print(i)
    # Python
    # Java
    # C++
    print(isinstance(title,Iterable))
    # True
    print(isinstance(title,Iterator))
    # False
    

      5,字符串(str)

    # 字符串str是可迭代对象,但是不是迭代器
    title = 'abc'
    for i in title:
        print(i)
    # a
    # b
    # c
    print(isinstance(title,Iterable))
    # True
    print(isinstance(title,Iterator))
    # False
    

      二,可迭代对象(Iterable)

      【简述】:可迭代对象就是可以被迭代获取的对象。

      【特点】: Iterable定义了绝返回迭代器的__iter__()方法

      【举例】:

    # list是可迭代对象
    title = ['Python','Java','C++']
    print(isinstance(title,Iterable))
    # 可迭代对象的iter方法返回一个迭代器
    a = iter(title)
    print(next(a))
    print(next(a))
    print(next(a))
    # next完毕再次next因为没有值所以抛出StopIteration异常
    # print(next(a))
    # StopIteration
    

      如果我们写出以下代码

    for elem in [1,2,3]:
        print(elem)
    

      则实际内部运算过程是这样,列表x是一个可迭代对象,在for循环中进过iter()方法变为迭代器,然后遍历x实际就是内部调用elem = next(x)

       三,迭代器(Iterator)

      【简述】:迭代器是一个带状态的对象。之所以说是带状态的对象是因为迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一个值。

      【特点】:

      ①Iterator实现了__iter__()和__next__()方法

      ②迭代器不会一次性把所有元素加载到内存,而是需要的时候才返回结果(不同于容器)

      【举例】:和上面例子一样,下面的a就是一个迭代器,和可迭代对象title不同,a可以通过next(a)来逐个获取其中的每个元素

    # list是可迭代对象
    title = ['Python','Java','C++']
    print(isinstance(title,Iterable))
    # 可迭代对象的iter方法返回一个迭代器
    a = iter(title)
    print(next(a))
    print(next(a))
    print(next(a))
    # next完毕再次next因为没有值所以抛出StopIteration异常
    # print(next(a))
    # StopIteration
    

      如果使用next(title)则会报TypeError错误,显示列表对象不是一个迭代器

    # 不是迭代器使用next方法会报TypeError错误
    # next(title)
    # TypeError: 'list' object is not an iterator
    

      迭代器每次调用next()方法的时候做两件事:

      1,为下一次调用next()方法修改状态

      2,生成当前调用的返回结果

     

  • 相关阅读:
    A. Difference Row
    B. Fixed Points
    命运
    Climbing Worm
    大学感想
    Constructing Roads
    lintcode605- Sequence Reconstruction- medium- airbnb google
    lintcode616- Course Schedule II- medium
    lintcode615- Course Schedule- medium
    lintcode127- Topological Sorting- medium
  • 原文地址:https://www.cnblogs.com/minseo/p/15357586.html
Copyright © 2020-2023  润新知