python高级-迭代器(18)

时间:2022-03-11 21:46:49

一、什么是迭代器

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

二、可迭代对象

直接作⽤于 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. HDU--1233--还是畅通工程--并查集

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. Google API在线生成二维码的方法

    1.先看一个实例,是用Google API生成西部e网的网站地址www.weste.net二维码的方法: http://chart.apis.google.com/chart?cht=qr&c ...

  3. ACE_linux:TCP通信

    1.涉及类 ACE_INET_Addr//ACE网络地址ACE_SOCK_Acceptor//ACE网络服务器ACE_SOCK_Connector//ACE网络客户端ACE_SOCK_Stream// ...

  4. JAXB - Hello World with Namespace

    如果元素带有命名空间,那么处理方式与 JAXB - Hello World 会略有不同. 1. XML Schema: <xsd:schema xmlns:xsd="http://ww ...

  5. I&sol;O体系结构和设备驱动程序

    http://blog.csdn.net/kafeiflynn/article/category/789844

  6. SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...

  7. 【jsp 练习】 给定三角形三边判断是否能组成三角形及计算面积

    Test.java package package1; public class Test { double side1 = -1 , side2 = -1 , side3 = -1 , area = ...

  8. Spring第九篇【Spring与Hibernate整合】

    前言 前面已经学习了如何使用Spring与Struts2进行整合,本博文主要讲解如何使用Spring对Hibernate进行整合 Spring和Hibernate整合的关键点: SessionFact ...

  9. 用DDK开发的9054驱动 &period;

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  10. 「Vue」vue生命周期

    Vue的生命周期 beforeCreate---created---beforeMount---mounted---(beforeupdate---updated :数据有更新时才会执行)---bef ...