zoukankan      html  css  js  c++  java
  • 可迭代对象和迭代器

    本文援引自:http://www.cnblogs.com/smallmars/p/6939519.html

    一、可迭代对象和迭代器

    1.迭代的概念

    上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 

    注:循环不是迭代

    while True: #只满足重复,因而不是迭代
         print('====>')

    2.可迭代的对象

    内置__iter__方法的,都是可迭代的对象。

    list是可迭代对象,dict是可迭代对象,set也是可迭代对象。

    [1,2].__iter__()
    'hello'.__iter__()
    (1,2).__iter__()
    
    {'a':1,'b':2}.__iter__()
    {1,2,3}.__iter__()

    例如:

    复制代码
    x = [1, 2, 3]
    y = iter(x)
    z = iter(x)
    print(next(y))
    print(next(y))
    print(next(z))
    print(type(x))
    print(type(y))
    复制代码

    输出

    1
    2
    1
    <class 'list'>
    <class 'list_iterator'>

      

    如下图所示

    这里x是一个可迭代对象,yz是两个独立的迭代器,迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。

    迭代器有一种具体的迭代器类型,比如list_iteratorset_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。

    3.迭代器

    • 1.为什么要有迭代器?

    对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。

    • 2.迭代器定义:

    迭代器:可迭代对象执行__iter__方法,得到的结果就是迭代器,迭代器对象有__next__方法

    它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter____next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常

    • 3.迭代器的实现

    例:

    复制代码
    i=[1,2,3].__iter__()  
    
    print(i)    #迭代器
    
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    #print(i.__next__()) #抛出异常:StopIteration
    复制代码

    输出

    <list_iterator object at 0x1019c3eb8>
    1
    2
    3

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

    1. 为下一次调用next()方法修改状态
    2. 为当前这次调用生成返回结果

    迭代器就像一个懒加载的工厂,等到有人需要的时候才给它生成值返回,没调用的时候就处于休眠状态等待下一次调用。

    • 4.如何判断迭代器对象和可迭代对象
    复制代码
    from collections import Iterable,Iterator
    'abc'.__iter__()
    ().__iter__()
    [].__iter__()
    {'a':1}.__iter__()
    {1,2}.__iter__()
    
    f=open('a.txt','w')
    f.__iter__()
    
    #判断是否为可迭代对象,以下都是 print(isinstance('abc',Iterable)) print(isinstance([],Iterable)) print(isinstance((),Iterable)) print(isinstance({'a':1},Iterable)) print(isinstance({1,2},Iterable)) print(isinstance(f,Iterable))
    #判断是否为迭代器,只有文件是 print(isinstance('abc',Iterator)) print(isinstance([],Iterator)) print(isinstance((),Iterator)) print(isinstance({'a':1},Iterator)) print(isinstance({1,2},Iterator)) print(isinstance(f,Iterator))
    复制代码

    输出

    复制代码
    True
    True
    True
    True
    True
    True
    False
    False
    False
    False
    False
    True
    复制代码

    可迭代对象:只有__iter__方法,执行该方法得到的迭代器对象

    迭代器:有__iter____next__()方法

    注:对于迭代器对象来说,执行__iter__方法,得到的结果仍然是它本身

    • 5.迭代器的优点和缺点

    优点:
    1.提供了一种不依赖下标的迭代方式
    2.就跌迭代器本身来说,更节省内存

    缺点:
    1. 无法获取迭代器对象的长度
    2. 不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退

  • 相关阅读:
    定义全局时间过滤器
    vue局部过滤器和全局过滤器
    vue-ref指令
    vue进行代码排序
    vue-通过name进行数据过滤
    将vue文档下载到本地预览
    由于vue的for循环id并不严谨,提高id严谨性
    vue指令v-for报错:Elements in iteration expect to have 'v-bind:key' directives.eslint-plugin-vue
    FlowPortal BPM历史版本升级说明
    102从 Outlook 中将电子邮件、联系人和日历导出到 .pst 文件
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/9101599.html
Copyright © 2011-2022 走看看