zoukankan      html  css  js  c++  java
  • Python 高级特性(5)- 迭代器

    前言

    迭代器貌似是 Python3 才有的(猜的),在廖雪峰大神的网站中 Python2 是没有迭代器一栏的

    可 for 循环的对象

    • 常见集合数据类型(迭代对象):list、tuple、dict、set、str
    • 生成器 generator

    可迭代对象(Iterable)

    可以直接用 for 循环的对象都叫可迭代对象

    关于 Iterable 的文章可以再看看这篇

    https://www.cnblogs.com/poloyy/p/14658433.html

    复习下生成器

    它可以用 for 循环拿到下一个值,也可以用 .next() 函数来拿到下一个值

    迭代器(Iterator)

    可以通过 .next() 函数调用并不断返回下一个值的对象就是迭代器

    如何判断是不是迭代器

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

    print(isinstance([], Iterator))
    print(isinstance({}, Iterator))
    print(isinstance("test", Iterator))
    print(isinstance(1234, Iterator))
    print(isinstance([x for x in range(2)], Iterator))
    print(isinstance((x for x in range(2)), Iterator))
    print(isinstance(enumerate([]), Iterator))
    
    # 输出结果
    False
    False
    False
    False
    False
    True
    True

    生成器都是 Iterator 对象,但 list、dict、str 虽然是 Iterable ,却不是 Iterator 

    如何变成 Iterator

    把 list、dict、str 等 Iterable 变成 Iterator 可以使用 iter() 函数

    print(isinstance(iter([]), Iterator))
    print(isinstance(iter({}), Iterator))
    print(isinstance(iter("test"), Iterator))
    print(isinstance(iter([x for x in range(2)]), Iterator))
    
    # 输出结果
    True
    True
    True
    True

    注意:非 iterable 对象不能调用这个方法哦,比如整型

    为什么 list、dict、str 等数据类型不是 Iterator

    • Iterator 对象表示的是一个数据流,Iterator 对象可以被  next() 函数调用并不断返回下一个数据,直到没有数据时抛出  StopIteration 错误
    • 可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算
    • Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的

    总结

    • 凡是可作用于 for 循环的对象都是 Iterable 类型
    • 凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列
    • 集合数据类型如 list、dict、str 等是 Iterable 但不是 Iterator,不过可以通过 iter() 函数获得一个 Iterator 对象
    • Python 的 for 循环本质上就是通过不断调用 next() 函数实现的
     
     
     
  • 相关阅读:
    老鸟的Python新手教程
    vs2010经常使用快捷键
    SQL基础--> 约束(CONSTRAINT)
    哈哈,做题了
    【网络协议】TCP中的四大定时器
    JAVA反射机制
    JUnit入门
    怎样将程序猿写出来的程序打包成安装包(最简单的)
    事件传递机制总结
    理解class.forName()
  • 原文地址:https://www.cnblogs.com/poloyy/p/14667150.html
Copyright © 2011-2022 走看看