一、什么是迭代器

  • 迭代是访问集合元素的⼀种⽅式。
  • 迭代器是⼀个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退

二、可迭代对象

直接作⽤于 for 循环的数据类型有以下⼏种:

  • ⼀类是集合数据类型:如 list 、 tuple 、 dict 、 set 、 str 等;
  • ⼀类是generator ,包括⽣成器和带 yield 的generator function。

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

三、判断是否可以迭代

可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:

#从collections.abc模块导入Iterable工具
from collections.abc import Iterable
#判断列表是否可以迭代
print(isinstance([],Iterable))
#判断字典是否可以迭代
print(isinstance({},Iterable))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterable))
#判断字符串是否可以迭代
print(isinstance("abc",Iterable))
#判断整形是否可以迭代
print(isinstance(100,Iterable))

运行结果为:

True
True
True
True
False

可以看出,列表、字典、生成器、字符串都是可以被迭代的,而整形常量不可以被迭代

四、迭代器

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:

#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#判断列表是否可以迭代
print(isinstance([],Iterator))
#判断字典是否可以迭代
print(isinstance({},Iterator))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterator))
#判断字符串是否可以迭代
print(isinstance("abc",Iterator))
#判断整形是否可以迭代
print(isinstance(100,Iterator))

运行结果为:

False
False
True
False
False

注意:

  • 判断是否可以被迭代使用的是 Iterable,而判断是否是迭代器使用的是 Iterator,不一样的 。
  • 生成器也是迭代器
  • 列表、字典、字符串虽然可以被迭代,但是不是迭代器,这就说明了,迭代器一定可以迭代,但是可以迭代的不一定是迭代器。这个道理就和鱼会游泳,但是会游泳的不一定是鱼,一个道理。

五、iter()函数

⽣成器是迭代器对象,但列表、字典 、字符串虽然是可迭代的,却不是迭代器。把列表、字典、字符串等可迭代对象变成迭代器可以使⽤ iter() 函数:

#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#没有使用iter()函数
print(isinstance([],Iterator))
print(isinstance("abc",Iterator)) #使用iter()函数
print(isinstance(iter([]),Iterator))
print(isinstance(iter("abc"),Iterator))

运行结果为:

False
False
True
True

六、使用迭代器完成for循环的底层实现

for x in [1,2,3,4,5]:
print(x) #完全等价于 # 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break

总结

  • 凡是可作⽤于 for 循环的对象都是 Iterable 类型;
  • 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得⼀个 Iterator 对象。
  • 迭代器对象就是实现了iter() 和 next()方法的对象.其中iter()返回迭代器本身,而next()返回容器的下一个元素,在结尾处引发StopInteration异常.
  • 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

python高级-迭代器(18)的更多相关文章

  1. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  2. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  3. python高级特征:列表生成式;generator, 迭代器。

    Python高级特性 列表生成式:不过一种语法糖 生成器:不过一个方法 迭代器: 列表生成式 Python内置的函数,来创建list. 简单的生成: >>> list(range(1 ...

  4. python高级之函数

    python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...

  5. python高级之面向对象高级

    python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...

  6. 第五篇:python高级之面向对象高级

    python高级之面向对象高级   python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...

  7. 第一篇:python高级之函数

    python高级之函数   python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...

  8. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  9. python高级(二)—— python内置序列类型

    本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...

随机推荐

  1. [转] Ramda 函数库参考教程

    学习函数式编程的过程中,我接触到了 Ramda.js. 我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具. 你可能会问,Underscore 和  ...

  2. [原创]大数据:布隆过滤器C#版简单实现。

    public class BloomFilter { public BitArray _BloomArray; public Int64 BloomArryLength { get; } public ...

  3. UOJ#7. 【NOI2014】购票 点分治 斜率优化 凸包 二分

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ7.html 题解 这题是Unknown的弱化版. 如果这个问题出在序列上,那么显然可以CDQ分治 + 斜率 ...

  4. 树莓派B+使用入门&RPI库安装&wringPi库安装

    最近看看试用一下树莓派进行一些开发操作,于是入手一块Raspberry Pi B+的板子来玩.由于没有显示器,没有备用的键盘和鼠标,所以想到用SSH来控制树莓派,刚开始还很担心已经安装好的操作系统到底 ...

  5. JAVA注释--2019-04-28

    一.JAVA自带注解 1.@Override:覆盖父类方法 2.@Deprecated:不建议使用(就是方法上画一条横线划掉那种) 3.@SuppressWarnings:去掉警告:使用方法:@Sup ...

  6. vue 组件的定义

    1.什么是组件? 组件的出现,就是为了拆分vue实例的代码量的,能够让我们以不同的组件来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可. 2.组件化和模块化的不同? 模块化: ...

  7. Hadoop的数据压缩

    一.Hadoop的数据压缩 1.概述 在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写 ...

  8. 向mysql中导入向导时如表xlsx

    如果出现这种问题那么是因为没有打开这个文件,如果想导入这个文件需要到开这个文件,然后再导入

  9. 指针*p,p,&p等辨别

    #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main ...

  10. 使用 Swoole 来加速 Laravel应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...