zoukankan      html  css  js  c++  java
  • 学以致用三十七-----弄懂迭代

    近半个多月以来,一直在重庆出差,山城真是一座很有特色的城市。轻轨,火锅是我印象最深的,然而却把功课给落下了不少。学习效率也不如从前,需尽快调整过来,差的状态不能迭代下去。

    那什么是迭代,这次就要把迭代给理理清楚来。

    可直接作用于for循环的数据类型有以下几种:

    一类是集合数据类型,如 list,tuple,dict,set,str等

    一类是generator,包扩生成器和带yield的generator function

    可直接作用于for循环的对象统统称为可迭代对象,也可称为可循环对象..Iterable

    判断一个对象是否可迭代,可使用如下方法

    >>> from collections import Iterable
    >>> isinstance([],Iterable)
    True
    >>> isinstance(100,Iterable)
    False
    >>> isinstance({},Iterable)
    True
    >>> isinstance((),Iterable)
    True
    >>> isinstance('abc',Iterable)
    True

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

    注意: 可迭代对象和迭代器的区别

     譬如:

    >>> a = [1,2,3]
    >>> dir(a)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
    >>>

    通过dir可以查看a的属性,发现没有next方法,因此a不是迭代器

    >>> from collections  import Iterator
    >>> isinstance((x for x in range(5)),Iterator)
    True
    >>> isinstance([],Iterator)
    False
    >>> isinstance({},Iterator)
    False

    可以看出这里 列表和字典都不是迭代器,

    而生成器是可迭代对象,也是迭代器

    >>> from collections import Iterable
    >>> isinstance((x for x in range(5)),Iterable)
    True

    迭代对象转换成迭代器,使用iter()函数

    >>> iter(a)
    <list_iterator object at 0x000002BF207CD9B0>
    >>> b = iter(a)
    >>> b.__next__()
    1
    >>> b.__next__()
    2
    >>> b.__next__()
    3
    >>> b.__next__()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>>

    python中的Iterator对象表示的是一个数据流,可以被next()函数调用并不断返回下一个数据,直到没有数据抛出StopIteration异常。Iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。

  • 相关阅读:
    Rsync常见运维操作命令
    [图文详解] Sublime Text在Windows/Ubuntu/Mac OSX中配置使用CTags
    Sublime Text : 创建工程
    Sublime Text 插件 & 使用技巧
    如何解决adb devices 端口被占用的问题zz
    Nginx 服务器安装及配置文件详解
    把notepad++设置为系统全局文本默认打开应用
    Ubuntu 下载 & 编译 Android5.1 源码
    同步、更新、下载Android Source & SDK from 国内镜像站
    如何为Linux生成和打上patch
  • 原文地址:https://www.cnblogs.com/liongong/p/10030040.html
Copyright © 2011-2022 走看看