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

    迭代器

        可以直接作用于for循环的数据类型有以下几种:
    一类是集合数据类型,如 ListTupleDict  ,   SetStr 等。

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

    这些可以直接作用于for循环的对象,统称为可迭代对象Iterable

    可以使用isinstance()  判断一个对象是否是Iterable对象:

     1 from collections import Iterable
     2 
     3 a = [1,2,3]
     4 b = (1,2,3)
     5 c = {'name':'Jason'}
     6 d = '王振'
     7 e = 5.6
     8 print(isinstance(a,Iterable))
     9 print(isinstance(b,Iterable))
    10 print(isinstance(c,Iterable))
    11 print(isinstance(d,Iterable))
    12 print(isinstance(e,Iterable))
    执行结果

    True
    True
    True
    False

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

    可以使用 isinstance()  判断一个对象是否是 Iterator 对象

    生成器都是Iterator 对象,但List , Dict ,  Str ,虽然式Iterable ,却不是Iterator。

     1 from collections import Iterable,Iterator
     2 
     3 a = (x for x in range(10))
     4 b = [1,2,3]
     5 c = {'name':'Jason'}
     6 d = '王振'
     7 e = 5.6
     8 print(isinstance(a,Iterator))
     9 print(isinstance(b,Iterator))
    10 print(isinstance(c,Iterator))
    11 print(isinstance(d,Iterator))
    12 print(isinstance(e,Iterator))
    执行结果

    True
    False
    False
    False
    False

    把 List,Dict,Str,等Iterable变成 Iterator 可以使用 iter() 函数。

    b = [1,2,3]
    c = {'name':'Jason'}
    print(isinstance(iter(b),Iterator))
    print(isinstance(iter(c),Iterator))

    你可能会问,为什么List,Dict,Str等数据类型不是Iterator?

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

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

     总结:

    凡是可作用于 for 循环的对象都是 Iterable 类型。

    凡是可作用于next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列。

    集合数据类型,如 List ,Set ,Dict ,Str等是Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator对象。

    Python的 for 循环本质上就是通过不断调用 next() 函数实现的。例如:

    1 for i in [1,2,3,4,5]:
    2     pass

    实际完全等价于:

     1 from collections import Iterable,Iterator
     2 
     3 # 首先获得Iterator对象
     4 it = iter([1,2,3,4,5])
     5 # 开始循环
     6 while True:
     7     try:
     8         #获得下一个值
     9         x = next(it)
    10     except StopIteration:
    11         # 遇到StopIteration异常,就退出循环
    12         break
  • 相关阅读:
    PostMan-NewMan运行参数
    shell脚本学习简单记录笔记
    android开发okhttp-4.9.1源码大致流程解读
    android开发获取键盘高度以及判断键盘是否显示(兼容分屏模式)
    Android开发The style on this component requires your app theme to be Theme.AppCompat (or a descendant)的解决方法
    Linux开发Ubuntu安装man手册
    Android开发源码解读四大组件源码解读简单梳理
    Android开发涉及到的AMS类和ActivityThread类源码解读
    Android开发为什么主线程可以一直运行而不会退出来
    前端CryptoJS加密、后端解密代码实现参考
  • 原文地址:https://www.cnblogs.com/parsonbf/p/12699076.html
Copyright © 2011-2022 走看看