4.5 迭代器

4.5.1 可迭代对象

	**字面意思分析**:可以重复的迭代的实实在在的东西。
list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)
**专业角度**: **内部含有`__iter__`方法的对象,就是可迭代对象。**
**内置函数**:dir() print(dir(str))

判断一个对象是否是可迭代对象有以下两种方式:

#方法一
print('__iter__' in dir(list)) #输出True #方法二
from collections import Iterable
l = [1,2,3,4]
s = 'asdf'
print(isinstance(l,Iterable))
print(isinstance(s,Iterable)) #输出True

优点:直观;操作方法多;

缺点:占用内存;除去索引和字典的key,不能迭代取值

4.5.2 迭代器iterator

字面意思:可重复迭代的工具

专业角度:含有__int____next__方法的对象就是迭代器

使用.__iter__()iter()可以将可迭代对象转换成迭代器

#方法一:
s = 'asasasa'
a = iter(s)
s = 'asasasa'
a = iter(s)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
#方法二:
l = [1,2,3,4]
l_iter = l.__iter__() #将可迭代对象转换成迭代器
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

for循环,能遍历一个可迭代对象,他的内部到底进行了什么?

  • 将可迭代对象转化成迭代器。(可迭代对象.iter())
  • 内部使用__next__方法,一个一个取值。
  • 加了异常处理功能,取值到底后自动停止。

利用while循环,模拟for循环内部循环可迭代对象的机制。

  1. 先要将可迭代对象转化成迭代器。
  2. 利用next对迭代器进行取值。
  3. 利用异常处理try一下防止报错。
l = [1,2,3,4,5,6]
count = 0
ite = iter(l)
while 1:
try : #try是一个问题处理机制,配合except返回的错误来终止循环
print(next(ite))
except StopIteration:
break

​ for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方

法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,最重要的一点,转化成迭代器,在循环时,同一时

刻在内存中只出现一条数据,极大限度的节省了内存。

迭代器的优点:

​ ·非常节省内存

​ ·惰性机制

迭代器的缺点:

​ ·不直观

​ ·操作不灵活

​ ·效率相对低

最新文章

  1. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
  2. cookie和浏览器
  3. Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)
  4. 【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)
  5. 控制反转IOC与依赖注入DI【转】
  6. Excel Aspose.Cells 设置单元格格式 为数字
  7. openSUSE13.2安装Nodejs并更新到最新版
  8. placeholder 属性的支持
  9. hdu 1299 Diophantus of Alexandria(数学题)
  10. Kettle 5.0源码编译
  11. kafka资料
  12. jacascript 函数声明、函数表达式与声明提升(hoisting机制)
  13. [LeetCode] String Compression 字符串压缩
  14. python简单入门
  15. JS中的同步和异步
  16. Redis讲解以及测试要点
  17. [osg]节点遍历nodevisitor浅析
  18. Python中元组、列表、字典的遍历和相互转化
  19. WPF 将TextBox更改为PasswordBox样式(文字显示方式为密码)
  20. 常问面试题:C++中sizeof的陷阱及应答

热门文章

  1. (转载)Ant自动编译打包android项目
  2. GooFlow
  3. layer 1.8.5 引用样式失效
  4. luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊
  5. tomcat 散点杂记
  6. vue-cli的基础构造
  7. ubuntu E: Could not get lock /var/lib/apt/lists/lock 异常信息
  8. @ControllerAdvice 全局异常处理
  9. docker容器的学习
  10. windows 简单实用Elasticsearch