1、迭代的概念

(1)什么是迭代

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

(2)迭代和遍历的区别

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

2、迭代器的概念

(1)概念

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

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

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

(2)优点

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

3、可迭代的对象(Iterable)

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

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

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

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

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

示例:

from collections.abc import Iterable

print(isinstance('', Iterable))  # true 字符串是可迭代的
print(isinstance([], Iterable)) # true 列表是可迭代的
print(isinstance((), Iterable)) # true 元组是可迭代的
print(isinstance({}, Iterable)) # true 字典是可迭代的
print(isinstance(set(), Iterable)) # true 集合是可迭代的

说明:

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

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

testList = list()

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

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

其他的可迭代序列同理。

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

1 = int()

4、迭代器对象(Iterator)

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

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

验证:

from collections.abc import Iterable, Iterator

print(isinstance('', Iterator))  # False 字符串不是迭代器对象
print(isinstance([], Iterator)) # False 列表不是迭代器对象
print(isinstance((), Iterator)) # False 元组不是迭代器对象
print(isinstance({}, Iterator)) # False 字典是不是迭代器对象
print(isinstance(set(), Iterator)) # False 集合不是迭代器对象 # iter()可把对应的可迭代对象转换成迭代器对象
print(isinstance(iter(""), Iterator)) # True 迭代器对象
print(isinstance(iter([]), Iterator)) # True 迭代器对象
print(isinstance(iter(()), Iterator)) # True 迭代器对象
print(isinstance(iter({}), Iterator)) # True 迭代器对象
print(isinstance(iter(set()), Iterator)) # True 迭代器对象

说明:

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

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

示例如下:

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

5、迭代器的使用体验

(1)基本用法

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

(2)实际应用

# 示例1
# 用迭代器来访问列表中的元素
# 定义一个列表
testList = [1, 2, 3, 4] # 把裂变转变成一个迭代器对象
it = iter(testList) # 使用迭代器取值
while True:
try:
# 调用next函数,获取下一个字符
result = next(it)
print(result)
except StopIteration:
# 释放对it的引用,即废弃迭代器对象
del it
# 不推出循环会成为私循环
break # 示例2
# 用迭代器来访问列表中的元素
# 定义一个字符串
testStr = "Python" # 把裂变转变成一个迭代器对象
it = iter(testStr) # 使用迭代器取值
for str in it:
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. 1120day-户别确认

    1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...

  2. android+opencv+opencl: cv::dft()的opencl版本的性能分析

    在小米mix 2s + 高通骁龙 845 + Adreno 630 上测试了opencl版本的cv::dft(). 测试数据 先看表格里面的描述: 名称 函数名 最大时间(ms) 平均时间(ms) 说 ...

  3. dubbo系列一、dubbo启动流程

    目录 dubbo启动流程分析记录 一.dubbo provider启动流程 1.自动装配 2.ServiceBean处理 3.服务暴露export() 3.1.检测dubbo.xxx.配置属性,配置到 ...

  4. Vue框架怎么使用mediainfo.js来检测视频文件是否有音轨?

    啥是MediaInfo? 简而言之,MediaInfo是一个能读取音频和视频文件并分析和输出音视频信息的工具,能输出的内容包括视频信息,音轨,字幕等. MediaInfo也可以在web端使用,需要使用 ...

  5. Django 优化杂谈

    Django 优化杂谈 Apr 21 2017 总结下最近看过的一些文章,然后想到的一些优化点,整理一下. 数据库连接池 http://mt.dbanotes.net/arch/instagram.h ...

  6. 腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群

    总结记录/朱季谦 最近买了一台4核16的腾讯云轻量应用服务器,花了我快四百的大洋,打算搭建一堆docker组件集群,最先开始是通过docker搭建redis集群,计划使用三个端口,分别是7001,70 ...

  7. hostnamectl主机名

    hostnamectl 可用于查询与修改系统主机名以及其他相关设置. 所谓"主机名",其实有三种不同的含义: "pretty"主机名,仅供人类阅读,可以包含各种 ...

  8. 【webpack4.0】---webpack的基本使用(四)

    一.什么是babel babel是一个编译javascript的平台,它可以编译代码帮你达到以下目的 1.让你使用最近的javascript代码(ES6 ES7) 而不用管新的标准浏览器是否支持   ...

  9. linux中rpm安装

    目录 一:linux中rpm安装 1.rpm简介 2.区别 3.RPM命令五种基本模式 二:RPM安装全面解析 1,下载软件包 2, 安装软件包 3, 尝试卸载 4, 更新(升级) 5,软件包名称: ...

  10. shell循环ping ip的写法

    #!/bin/bash for i in `seq 1 20` do if ping -w 2 -c 1 192.168.43.$i | grep "100%" > /dev ...