
python之迭代器
发布日期:2021-05-04 19:07:22
浏览次数:19
分类:原创文章
本文共 4144 字,大约阅读时间需要 13 分钟。
python之迭代器
文章目录
一、迭代器介绍
什么是迭代器?
迭代器指的是用来迭代取值的工具, 迭代就是一个重复的过程, 每次重复都是基于上一次的结果而进行的. 单纯的重复并不是迭代.
代码示例
count =1while count <5: print(count) count +=1l=[11,22,333,44,555]def get_item(l): count=0 while count <len(l): print(l[count]) count+=1
为何要用迭代器
迭代器是用来取值的工具,而涉及到把多个值循环取出来的类型有:列表, 字符串, 元组, 字典, 集合, 打开的文件
- 为了找到一种通用的取值方案
- 为了节省内存
区分迭代与单纯的重复:
单纯的重复:
while True: msg = input(">>>:").strip() print(msg)
迭代取值:
需求:使用whlie
循环打印出列表中的每项元素的值
# 需求: 使用while循环打印列表中的每项元素的值# while循环是一个重复的过程, 且每次重复都是基于上一次的index累加操作之后的结果而继续的, 所以这是一个迭代现象.goods = ['mac', 'lenovo', 'acer', 'dell', 'sony']index = 0while index < len(goods): print(goods[index], end=' ') # mac lenovo acer dell sony index += 1
如何用迭代器
内置有__iter__方法的类型都称之为可迭代的对象但凡调用了__iter__方法,就会将该类转换成迭代器对象比如res=值.__iter__()
二、可迭代对象
什么是可迭代对象?
可迭代对象:iterable
可迭代对象就是可以转换为迭代器的对象
从语法层面上讲,内置有__iter__()
方法的的对象, 内置可以iter()
的对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象
"hello".__iter__ [].__iter__ (11,).__iter__ { "k1":111}.__iter__ { 11,22}.__iter__ f=open("a.txt",mode='wt') # 文件本身就是迭代器对象 f.__iter__
三、迭代器对象
什么是迭代器对象?
迭代器: iterato
从语法层面上讲,内置有__iter__()
和__next__()
方法的的对象, 内置可以iter()
和next()
的对象
如何得到迭代器对象?
可迭代对象执行__iter__()
和iter()
得到了迭代器对象
迭代器对象执行__iter__()
和iter()
仍然是迭代器本身
探讨部分:
迭代器执行__iter__()方法和iter()就是迭代器本身, 为什么迭代器对象下也要有内置__iter__()方法和iter()?主要为了满足for循环迭代取值. for循环上来的第一件事就是调用你需要遍历的对象下的__iter__()方法, 无论你需要遍历的对象是可迭代对象, 还是迭代器对象. 减少这种区分的可能性.
示例:
# 示例一: 调用可迭代对象下的__iter__()方法或者iter()会将其转换成迭代器对象dic = { 'a': 1, 'b': 2, 'c': 3}dic_iterator = dic.__iter__()# 示例二: 转换成迭代器对象以后, 就可以使用内置方法__next__()或者next()迭代取值, 且每迭代取值一次, 都会作为下一次迭代取值的初始值.(字典默认迭代的是key)print(dic_iterator.__next__()) # aprint(dic_iterator.__next__()) # bprint(dic_iterator.__next__()) # c# 示例三: 当迭代器对象迭代完毕以后, 继续迭代会抛出异常: StopIterationprint(dic_iterator.__next__()) # 抛出异常: StopIteration# 示例四: 当抛出异常时, 也就是迭代器对象被迭代取值完毕时, 我们可以使用异常处理机制捕捉异常'''# 伪代码示例: try: 会出现异常的代码except 捕捉的抛出异常的类型: 捕捉异常以后要继续进行的操作'''dic_iterator = dic.__iter__()while True: try: print(dic_iterator.__next__()) except StopIteration: break# 示例五: 基于示例四, 在迭一个迭代器迭代取值干净的情况下, 再对其取值取不到. 如果需要再次取值, 需要对可迭代对象重新使用__iter__()或者iter()生成一个新的迭代器对象.print('=======>') # =======>dic_iterator = dic.__iter__()while True: try: print(dic_iterator.__next__()) except StopIteration: break
总结:
1. 调用可迭代对象下的`__iter__()`方法或者`iter()`会将其转换成迭代器对象 2. 转换成迭代器对象以后, 就可以使用内置方法`__next__()`或者`next()`迭代取值, 且每迭代取值一次, 都会作为下一次迭代取值的初始值.(字典默认迭代的是key)3. 当迭代器对象迭代完毕以后, 继续迭代会抛出异常: `StopIteration `4. 当抛出异常时, 也就是迭代器对象被迭代取值完毕时, 我们可以使用异常处理机制捕捉异常 5. 在迭一个迭代器迭代取值干净的情况下, 再对其取值取不到. 如果需要再次取值, 需要对可迭代对象重新使用`__iter__()`或者`iter()`生成一个新的迭代器对象
四、for循环原理
for
循环与while
循环
while循环称之为条件循环, 条件为False, 循环结束.for循环也可以称之为迭代循环, 遍历对象迭代取值完毕, 循环结束.
for 循环低层原理:
迭代取值做的三件事:
- 把准备要遍历的对象, 无论是什么类型, 上来直接使用内置的
__iter__()
方法得到一个迭代器对象. - 然后通过拿到的迭代器对象, 直接使用内置的
__next__()
迭代取值, 把取到的值赋值给in前面自定义的变量名. - 循环往复步骤2, 直到迭代取值完毕抛出异常
StopIteration
, 接着for循环会捕捉异常, 最后结束循环.
示例:
# 示例: 使用for循环遍历取值goods = ['mac', 'lenovo', 'acer', 'dell', 'sony']for item in goods: print(item, end=' ') # mac lenovo acer dell sony # 示例: 调用list()功能, 与for循环原理相同 list('hello')# 使用while循环 + try...except实现迭代取值. 迭代器迭代完毕except捕获异常: StopIterationgoods = ['mac', 'lenovo', 'acer', 'dell', 'sony']iterator_goods = iter(goods)while True: try: print(next(iterator_goods), end=' ') # mac lenovo acer dell sony except StopIteration: break
五、总结
可迭代对象与迭代器对象之间的关系
可迭代对象:
- 从语法层面上讲, 内置有
__iter__()
方法和可以使用iter()
的对象 - 可迭代对象可以通过
__iter__()
方法或者可以使用iter()
得到迭代器对象
示例:
可迭代对象.__iter__() --> 生成迭代器对象iter(可迭代对象) ---> 生成迭代器对象
迭代器对象:
-
从语法层面上讲, 内置有
__next__()
方法和可以使用next()
, 也能使用__it
-
迭代器对象执行
__next__()
方法或者使用next()得到迭代器的下一个值-
示例
迭代器对象.__next__() --> 迭代器的下一个值next(迭代器对象) --> 迭代器的下一个值
-
-
迭代器对象执行
__iter__()
方法或者使用iter()
得到迭代器本身.(调用了和没调用一模一样)-
示例:
迭代器对象.__iter__() --> 得到迭代器本身iter(迭代器对象) --> 得到迭代器本身
-
验证:
#迭代器对象执行__iter__()方法或者使用iter()得到迭代器本身.(调用了和没调用一模一样)dic = { 'a': 1, 'b': 2, 'c': 3}dic_iterator = iter(dic)print(dic_iterator is iter(dic_iterator).__iter__().__iter__()) # True
-
迭代器的优缺点
优点:
- 提供了一种不依赖与索引一种通用迭代取值方案
- 惰性计算: 对迭代器本身来说, 同一时刻在内存中只有一个值, 它可以存放无限大的数据流.,可以节省内存
缺点:
- 取值麻烦,无法预测值的长度
- 不能控制取值顺序, 只能取下一个值, 更不能回到开始,调用时一次性的,若想重新获取值, 只能重新调用
__iter__()
方法和iter()
生成一个新的迭代器.
发表评论
最新留言
不错!
[***.144.177.141]2025年03月12日 04时43分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
BugkuCTF web_1-10
2019-03-04
零基础入门JavaScript 这一篇笔记就够了
2019-03-04
MySQL_属性、记录长度、设计范式、表关系
2019-03-04
MySQL_安全管理、表单传值、php操作
2019-03-04
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
2019-03-04
BUUCTF web WarmUp
2019-03-04
hcnp笔记
2019-03-04
python数据分析
2019-03-04
MySQL(四)数据库结构设计
2019-03-04
JavaScript 函数作用域
2019-03-04
2021-05-03
2019-03-04
Mybatis-plus 常用注解
2019-03-04
HTML基本结构
2019-03-04
图(三):拓扑排序、关键路径
2019-03-04
mybatis 如何切割字符串 查询多个值
2019-03-04
算法初步 (排序, 散列, 贪心, 二分, two pointers)
2019-03-04
Python学习-基础(五)
2019-03-04
myqsl下载安装
2019-03-04