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. Golang 基准测试Benchmark

    基准测试 Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试. 基本规则 基准测试的代码文件必须以 ...

  2. 【刷题-LeetCode】203. Remove Linked List Elements

    Remove Linked List Elements Remove all elements from a linked list of integers that have value *val* ...

  3. golang中使用zap日志库

    1. 快速使用 package main import ( "go.uber.org/zap" "time" ) func main() { // 1. sug ...

  4. golang中的pair

    package main import "fmt" type Reader interface { ReadBook() } type Writer interface { Wri ...

  5. gin中间request body绑定到不同的结构体中

    1. 一般通过调用 c.Request.Body 方法绑定数据,但不能多次调用这个方法. package main import ( "fmt" "github.com/ ...

  6. dubbo-gateway 高性能dubbo网关

    dubbo-gateway dubbo-gateway 提供了http协议到dubbo协议的转换,但[并非]使用dubbo的[泛化]调用(泛化调用性能比普通调用有10-20%的损耗,通过普通异步的调用 ...

  7. Nginx配置文件nginx.conf有哪些属性模块?

    worker_processes 1: # worker进程的数量 events { # 事件区块开始 worker_connections 1024: # 每个worker进程支持的最大连接数 } ...

  8. C++函数调用过程解析

    编译环境:Windows 10 + VS2015. 0.引言 函数调用的过程实际上也就是一个中断的过程,本文演示和深入分析参数入栈.函数跳转.保护现场.恢复现场等函数调用过程. 首先对三个常用的寄存器 ...

  9. CF1574F Occurrences

    考虑什么样的串是合法的. 直接考虑比较抽象,考虑具象化这个问题. 容易发现一个字符串的限制就相当于如果出现了其中一个字符 \(a_i = c\),那么 \(s\) 中 \(c\) 前 \(i - 1\ ...

  10. SqlServer基础语法

    历史 有很多软件公司开发了数据库产品,其中微软公司的数据库产品命名为 SQL Server,也称 MS SQL Server. 1989年 Ashton-Tate/Microsoft SQL Serv ...