zoukankan      html  css  js  c++  java
  • 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,生成当前调用的返回结果

     

  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/minseo/p/15357586.html
Copyright © 2011-2022 走看看