Python3 迭代器深入解析
第6章 函数
- 6.1 函数的定义和调用
- 6.2 参数传递
- 6.3 函数返回值
- 6.4 变量作用域
- 6.5 匿名函数(lambda)
- 6.6 递归函数
- 6.7 迭代器
- 6.8 生成器
- 6.9 装饰器
6.7 迭代器

可迭代对象iterable
首先可以使用isinstance(对象名,Iterable)验证某一对象是否为可迭代对象
# 验证字符串、元组、列表、字典、集合类型是否为可迭代对象
from collections.abc import Iterable
int1 = 12306
str1 = "MondayTuesdaywednesdayThursdayFridaySaturdaySunday"
tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
list1 = ["Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
dict1 = {"Monday": "星期一", "Tuesday": "星期二", "wednesday": "星期三", "Thursday": "星期四", "Friday": "星期五", "Saturday": "星期六",
"Sunday": "星期日", }
set1 = {"Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
print(isinstance(int1, Iterable))
print(isinstance(str1, Iterable))
print(isinstance(tuple1, Iterable))
print(isinstance(list1, Iterable))
print(isinstance(dict1, Iterable))
print(isinstance(set1, Iterable))
output:
False
True
True
True
True
True
# 验证的结果是字符串、元组、列表、字典、集合类型都是可迭代对象,数值不是可迭代对象。
可迭代对象的意思就是说这个实体是可迭代的,例如字符串、列表、元组、字典、集合、迭代器等等,可以用for ... in进行循环,
# 那么都可用for循环进行迭代取值,以元组为例
tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
for i in tuple1:
print(i,end=',')
output:
Monday,Tuesday,wednesday,Thursday,Friday,Saturday,Sunday,
可以使用for循环迭代的标志是每个对象内部实现了__iter__方法,验证下每个可迭代对象是否有这个方法
str1 = "MondayTuesdaywednesdayThursdayFridaySaturdaySunday"
tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
list1 = ["Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
dict1 = {"Monday": "星期一", "Tuesday": "星期二", "wednesday": "星期三", "Thursday": "星期四", "Friday": "星期五", "Saturday": "星期六", "Sunday": "星期日", }
set1 = {"Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
print(("__iter__" in dir(str1)))
print(("__iter__" in dir(tuple1)))
print(("__iter__" in dir(list1)))
print(("__iter__" in dir(dict1)))
print(("__iter__" in dir(set1)))
output:
True
True
True
True
True
可迭代对象不是迭代器,如何变成迭代器呢?
# 可迭代对象通过调用__iter__方法就变成迭代器对象
tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
t1 = tuple1.__iter__()
print(t1)
output:
<tuple_iterator object at 0x0000027B44442EC8> # iterator的意思是迭代器
先稍微总结下,可迭代对象都有__iter__方法,而没有__next__方法。迭代器是怎么来的?是通过可迭代对象调用__iter__方法来生成一个迭代器对象,那么迭代器对象就拥有了__iter__和__next__方法。
# 验证下迭代器是否有__next__方法
tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
t1 = tuple1.__iter__()
print(t1)
print("__next__" in dir(t1))
output:
<tuple_iterator object at 0x000001D7F73E2EC8>
True
可迭代对象可通过索引取值、遍历取值,那么迭代器如何取值呢?
# 迭代器使用next()取值
# tuple1 = ("Monday", "Tuesday", "wednesday", "Thursday", "Friday", "Saturday", "Sunday")
t1 = tuple1.__iter__()
print(t1)
print(t1.__next__())
print(t1.__next__())
print(t1.__next__())
print(t1.__next__())
print(t1.__next__())
print(t1.__next__())
print(t1.__next__())
output:
<tuple_iterator object at 0x000001D7F73E2EC8>
Monday
Tuesday
wednesday
Thursday
Friday
Saturday
Sunday
StopIteration
# 最后一次取值时报错了,next一次取一个值,取完后来通过报StopIteration这个错误结束。
讲了这么多到底什么是迭代器?
在Python中,迭代器是遵循迭代协议的对象,通过调用可迭代的对象的__iter__方法生成迭代器对象,迭代器对象具有__next__方法,可通过此方法对迭代器取值。
这时能理解for语句如何实现遍历的吗?for语句通过调用可迭代对象的__iter__方法,这个方法返回一个迭代器,for语句循环调用迭代器内的每个元素的__next__方法,当迭代器为空时,__next__方法会引发一个StopIteration异常,这个异常会告诉for语句终止循环。
迭代器到底有什么用呢?
节约内存空间:文本文件本身是迭代器对象,用迭代器的方式访问文件时,可以每次读取一行,而不必一次性将整个文件读入,节约内存。
# r1.txt文本文件内容
"""
Monday
Tuesday
wednesday
Thursday
Friday
Saturday
Sunday
"""
r1 = open("r1.txt")
print(r1.__next__(), end="")
print(r1.__next__(), end="")
output:
Monday
Tuesday
迭代
讲完迭代器后,迭代就比较好理解了,迭代就是从迭代器中取元素的过程。
比如我们用for循环从train = "12306"中取元素,这种遍历过程就被称作迭代。
# for循环的对象必须是可迭代对象,如果这个对象不是,那么会报错
train = 12306
for i in train:
print(i)
output:
TypeError: 'int' object is not iterable
如果你不想用for循环迭代呢?这时你可以:
- 先调用容器(以字符串为例)的iter()函数
- 再使用 next() 内置函数来调用 next() 方法
- 当元素用尽时,next() 将引发 StopIteration 异常

# 定义一个字符串
>>> train = "12306"
>>> it = iter(train)
>>> it
<str_iterator object at 0x000001E30D71BE48>
>>> next(it)
'1'
>>> next(it)
'2'
>>> next(it)
'3'
>>> next(it)
'0'
>>> next(it)
'6'
>>> next(it)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration
# 用while循环模拟实现上面的过程
def while_iterator(iterable_obj):
iterator_obj = iter(iterable_obj)
while 1:
try:
print(next(iterator_obj), end=' ')
except StopIteration:
return
train = "12306"
while_iterator(train)
output:
1 2 3 0 6
Python3 迭代器深入解析的更多相关文章
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- python014 Python3 迭代器与生成器
Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...
- python3接收、解析邮件
邮件接收 python3可以使用poplib.POP3进行邮件接收,具体如下: import poplib from email.parser import Parser def get_email( ...
- Python——迭代器和解析(3)
用迭代工具模拟zip和map ====================================================================== 我们已经知道了zip怎样组合 ...
- 《Python 学习手册4th》 第十四章 迭代器和解析
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- python3 迭代器(Iterator)和生成器(generator)
一.迭代器定义: 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象: 集合数据类型如list.dict.str等是Iterable但不是Iterator,不过可以通过iter()函数获 ...
- Python3 迭代器和生成器
想要搞明白什么是迭代器,首先要了解几个名词:容器(container).迭代(iteration).可迭代对象(iterable).迭代器(iterator).生成器(generator). 看图是不 ...
- Python3迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- Python 进阶_迭代器 & 列表解析
目录 目录 迭代器 iter 内建的迭代器生成函数 迭代器在 for 循环中 迭代器与字典 迭代器与文件 创建迭代器对象 创建迭代对象并实现委托迭代 迭代器的多次迭代 列表解析 列表解析的样例 列表解 ...
随机推荐
- IntelliJ IDEA中项目import与open的区别
场景: 从原来公司离职来到新的公司,接手公司项目,先将项目从git或svn项目版本管理上clone下来,如果项目原先是用Eclipse开发的,而你更习惯于使用IntelliJ IDEA,下面是针对使用 ...
- WINCC 应用与提高(78讲15.98G)视频教程网盘下载
收集与网络,供参考. https://blog.csdn.net/txwtech/article/details/94225748
- 第二章、Web中使用shiro(实现登陆)
虽然Apache Shiro的核心设计目标允许它用于保护任何基于JVM的应用程序(如命令行应用程序,服务器守护程序,Web应用程序等),但本指南将着重讨论最常见的用例:确保运行的Web应用程序一个Se ...
- 手写React的Fiber架构,深入理解其原理
熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...
- Java深拷贝和浅拷贝的区别
浅拷贝 被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象.换言之,浅拷贝 不复制引用对象. 1 class Experience { 2 private String ...
- 阿里巴巴--java多线程的两种实现方式,以及二者的区别
阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...
- SqlServer2016 startengine错误的解决方式整理
因为某些需要,最近在安装SqlServer2016,但总是安装失败,按照网上各路大佬的解决方案都没有成功.报错提示为两个:无法获取数据库引擎句柄,无法恢复数据库引擎服务.按照网上做法,使用admini ...
- zabbix4.4安装
本安装操作系统为centos7.5. 安装前准备: 1.1 安装依赖包: yum -y install wget net-snmp-devel OpenIPMI-devel httpd openssl ...
- 一种基于LQR使输出更加稳定的算法(超级实用)
已知: 令: 则: 以上三式成立 具体步骤: 状态量最后一行加入“上一时刻的控制量”: A,B根据上述方法变形: Q,R增加维度(控制量一般都为一个,此时R维度不变): 最关键的是——输出量已经变为“ ...
- python实用笔记——IO编程
打开文件 f = open('/Users/michael/test.txt', 'r') 再读取 >>> f.read() 'Hello, world!' 最后关闭 >> ...