1、迭代的概念

(1)什么是迭代

迭代就是单向地、逐个地访问某个容器中的元素的行为。 简单说迭代就是循环。

(2)迭代和遍历的区别

迭代是遍历的一种特例,遍历(traverse)是可以在数据结构上来回的游走,不仅可以往前,还可以往后,同时还能保证不重不漏的,迭代是单向的,逐个的,而且只来一次。

2、迭代器的概念

(1)概念

在Python中常见的序列有listtuplesetdictstr,我们也称之为容器。

我们之前在遍历这些容器的时候,针对不同的容器,每次写的代码还都有所差别。于是我们想能不能写一个工具,当我们需要对一个容器中的元素,进行单向的,一个接一个的取出来的时候,就调用这个工具。

这个工具可以帮我们把不同容器遍历细节上的不同屏蔽掉,当我们需要这个操作的时候,就把容器直接传给这个工具就好了,而这个工具就叫迭代器。

(2)优点

  • 从序列类型中一个一个的取值,会把所有的值都取到。
  • 节省内存空间,迭代器并不会在内存中占用一大块内存,面是随着循环每次生成一个,每调用一次next方法就会返回给我一个元素。

3、可迭代的对象(Iterable)

(1)什么是可迭代的对象

简单的说,一个对象只要实现了只要实现了__iter__()方法,就是一个可迭代的对象。

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

(2)Python中常见的可迭代数据类型

  1. 集合或序列类型(如listtuplesetdictstr
  2. 文件对象(以后扩展)
  3. 在类中定义了__iter__()方法的对象,可以被认为是 Iterable对象,

示例:

  1. from collections.abc import Iterable
  2. print(isinstance('', Iterable)) # true 字符串是可迭代的
  3. print(isinstance([], Iterable)) # true 列表是可迭代的
  4. print(isinstance((), Iterable)) # true 元组是可迭代的
  5. print(isinstance({}, Iterable)) # true 字典是可迭代的
  6. print(isinstance(set(), Iterable)) # true 集合是可迭代的

说明:

这些内置集合或序列对象都有__iter__方法,即他们都实现了同名方法。

我们可以随便定义一个序列,如下:

  1. testList = list()

在PyCharm中按住ctrl键点击list()就可以查看list类的源码。

源码中我们就能够看到list类中定义了__iter__函数。

其他的可迭代序列同理。

像int数据类型,按住ctrl键点击查看。int类中并没有定义__iter__函数。

  1. 1 = int()

4、迭代器对象(Iterator)

序列类型(如listtuplesetdictstr等)都是可迭代对象,但是他们并不是迭代器对象。

可以使用iter()函数把可迭代对象(Iterable)变成迭代器对象(Iterator):

验证:

  1. from collections.abc import Iterable, Iterator
  2. print(isinstance('', Iterator)) # False 字符串不是迭代器对象
  3. print(isinstance([], Iterator)) # False 列表不是迭代器对象
  4. print(isinstance((), Iterator)) # False 元组不是迭代器对象
  5. print(isinstance({}, Iterator)) # False 字典是不是迭代器对象
  6. print(isinstance(set(), Iterator)) # False 集合不是迭代器对象
  7. # iter()可把对应的可迭代对象转换成迭代器对象
  8. print(isinstance(iter(""), Iterator)) # True 迭代器对象
  9. print(isinstance(iter([]), Iterator)) # True 迭代器对象
  10. print(isinstance(iter(()), Iterator)) # True 迭代器对象
  11. print(isinstance(iter({}), Iterator)) # True 迭代器对象
  12. print(isinstance(iter(set()), Iterator)) # True 迭代器对象

说明:

可迭代对象支持内置函数iter,通过对可迭代对象调用iter函数,会返回一个迭代器。而“迭代器”支持内置函数next(),通过不断对其调用next()方法,会依次前进到序列中的下一个元素并将其返回,最后到达序列的末尾时,会引发StopIteration异常。

补充说明一点,对迭代器调用iter方法,则会返回迭代器自身。

示例如下:

  1. # 定义一个列表
  2. testList = [1, 2, 3, 4]
  3. # 把列表转变成一个迭代器对象
  4. it = iter(testList)
  5. # 迭代器对象调用__iter__,返回迭代器对象本身
  6. # <list_iterator object at 0x0000000002674B88>
  7. print(it.__iter__())

5、迭代器的使用体验

(1)基本用法

  1. # 定义一个列表
  2. testList = [1, 2, 3, 4]
  3. # 把列表转变成一个迭代器对象
  4. it = iter(testList)
  5. # 使用迭代器
  6. # 从迭代器中取出一个接着一个的元素
  7. print(next(it)) # 1
  8. print(next(it)) # 2
  9. print(next(it)) # 3
  10. print(next(it)) # 4
  11. # 当迭代完存储的所有元素之后,如果继续迭代,
  12. # # 则 __next__() 方法会抛出 StopIteration 异常。
  13. print(next(it)) # StopIterable 异常

(2)实际应用

  1. # 示例1
  2. # 用迭代器来访问列表中的元素
  3. # 定义一个列表
  4. testList = [1, 2, 3, 4]
  5. # 把裂变转变成一个迭代器对象
  6. it = iter(testList)
  7. # 使用迭代器取值
  8. while True:
  9. try:
  10. # 调用next函数,获取下一个字符
  11. result = next(it)
  12. print(result)
  13. except StopIteration:
  14. # 释放对it的引用,即废弃迭代器对象
  15. del it
  16. # 不推出循环会成为私循环
  17. break
  18. # 示例2
  19. # 用迭代器来访问列表中的元素
  20. # 定义一个字符串
  21. testStr = "Python"
  22. # 把裂变转变成一个迭代器对象
  23. it = iter(testStr)
  24. # 使用迭代器取值
  25. for str in it:
  26. print(str)

参考:

『无为则无心』Python基础 — 61、Python中的迭代器的更多相关文章

  1. 『无为则无心』Python基础 — 3、搭建Python开发环境

    目录 1.Python开发环境介绍 2.Python解释器的分类 3.下载Python解释器 4.安装Python解释器 5.Python解释器验证 1.Python开发环境介绍 所谓"工欲 ...

  2. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  3. 『无为则无心』Python基础 — 6、Python的注释

    目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...

  4. 『无为则无心』Python基础 — 7、Python的变量

    目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...

  5. 『无为则无心』Python基础 — 10、Python字符串的格式化输出

    目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...

  6. 『无为则无心』Python基础 — 12、Python运算符详细介绍

    目录 1.表达式介绍 2.运算符 (1)运算符的分类 (2)算数运算符 (3)赋值运算符 (4)复合赋值运算符 (5)比较运算符 3.逻辑运算符 拓展1:数字之间的逻辑运算 拓展2:Python中逻辑 ...

  7. 『无为则无心』Python基础 — 44、对文件和文件夹的操作

    目录 1.os模块介绍 2.查看os模块相关文档 3.os模块常用方法 (1)文件重命名 (2)删除文件 (3)创建文件夹 (4)删除文件夹 (5)获取当前目录 (6)改变默认目录 (7)获取目录列表 ...

  8. 『无为则无心』Python序列 — 24、Python序列的推导式

    目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...

  9. 『无为则无心』Python函数 — 29、Python变量和参数传递

    目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...

随机推荐

  1. [USB波形分析] 全速USB波形数据分析(一)

    在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信.今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析. USB基本波形 USB通过一 ...

  2. python pip无法安装到2.7

    问题 pip默认指向python3.6,没有pip2,pip2.7 解决办法 加上应用路径 加上系统环境变量 参考 https://www.cnblogs.com/fanyuchen/p/712768 ...

  3. seq2seq+torch7聊天机器人bug处理

    [C]: in function 'error' ...root1/torch/install/share/lua/5.2/rnn/recursiveUtils.lua:44: in function ...

  4. CAS基础

    有锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一 ...

  5. 多线程-创建线程第二种方式-实现Runnable接口-细节和好处

    1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...

  6. Unity——日志打印工具

    一.日志工具功能 封装Debug类,需要实现功能: 1.控制所有日志是否打印: 2.除了Log,Warning,Error外,给更多日志种类(不同颜色): 3.格式化打印日志: 4.不定参数,自动拼接 ...

  7. chapter2 线性回归实现

    1 导入包 import numpy as np 2 初始化模型参数 ### 初始化模型参数 def initialize_params(dims): w = np.zeros((dims, 1)) ...

  8. asyncio和aiohttp

    asyncio官网 https://docs.python.org/zh-cn/3/library/asyncio-task.html 下面为伪代码: import aiohttp import as ...

  9. vector概述

    vector是一个能够支持任何类型的容器,本身为一个可以动态增长的数组. 1.vector基本数据结构 STL中所有的容器都包括三部分: 迭代器,遍历容器的元素,控制容器空间的边界和元素移动. 构造函 ...

  10. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6

    公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...