我们之前一直在用可迭代对象进行操作,那么到底什么是可迭代对象.我们现在就来讨论讨论可迭代对象.首先我们先回顾下我们

熟知的可迭代对象有哪些:

str  list   tuple  dic  set  那为什么我们称他们为可迭代对象呢?因为他们都遵循了可迭代协议,那什么又是可迭代协议呢.首先我们先看一段错误的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
对的
= 'abc'
for in s:
    print(i)
 
结果:
a
b
c
 
错的
for in 123:
    print(i)
 
结果
Traceback (most recent call last):
  File "D:/python_object/二分法.py", line 62in <module>
    for in 123:
TypeError: 'int' object is not iterable

  

注意看报错信息,报错信息中有这样一句话: 'int' object is not iterable 翻译过来就是整数类型对象是不可迭代的.

iterable表示可迭代的.表示可迭代协议 那么如何进行验证你的数据类型是否符合可迭代协议.我们可以通过dir函数来查看类中定义好的

所有方法

1
2
3
= 'abc'
print(dir(a))  # dir查看对象的方法和函数
# 在打印结果中寻找__iter__ 如果存在就表示当前的这个类型是个可迭代对象

我们刚刚测了字符串中是存在__iter__的,那我们来看看  列表,元祖,字典.集合中是不是有存在__iter__

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 列表
lst = [1,2]
print(dir(lst))
 
# 元祖
tuple = (1,2)
print(dir(tuple))
 
# 字典
dic = {'a':1,'b':2}
print(dir(dic))
 
# 集合
se = {1,2,3,4,4}
print(dir(se))

是不是发现以上都有__iter__并且还很for循环啊,其实也可以这么说可以for循环的就有__iter__方法,包括range

1
print(dir(range))

这是查看一个对象是否是可迭代对象的第一种方法,我们还可以通过isinstence()函数来查看一个对象是什么类型的

1
2
3
4
5
6
7
8
= [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable)) #True             #查看是不是可迭代对象
print(isinstance(l,Iterator)) #False            #查看是不是迭代器
print(isinstance(l_iter,Iterator)) #True       
print(isinstance(l_iter,Iterable)) #True

通过上边的我们可以确定.如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议.就可以获取到相应的迭代器

.这里的__iter__是帮助我们获取到对象的迭代器.我们使用迭代器中的__next__()来获取到一个迭代器的元素,那么我们之前所讲的

for的工作原理到底是什么? 继续向下看:

1
2
3
4
5
6
7
8
9
10
= "我爱北京天安⻔"
= s.__iter__() # 获取迭代器
print(c.__next__()) # 使⽤迭代器进⾏迭代. 获取⼀个元素 我
print(c.__next__()) # 爱
print(c.__next__()) # 北
print(c.__next__()) # 京
print(c.__next__()) # 天
print(c.__next__()) # 安
print(c.__next__()) # ⻔
print(c.__next__()) # StopIteration

for循环是不是也可以,并且还不报错啊,其实上边就是for的机制,

我们使用while循环和迭代器来模拟for循环: 必须要会

1
2
3
4
5
6
7
8
9
lst = [6,5,4]
= lst.__iter__()
 
while True:
    try:
        = l.__next__()
        print(i)
    except StopIteration:
        break

注意: 迭代器不能反复,只能向下执行

总结:

Iterable: 可迭代对象. 内部包含__iter__()函数

Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().

迭代器的特点:

1. 节省内存.

2. 惰性机制

3. 不能反复, 只能向下执行.

我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中.  然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候.一开始的 时候是__iter__()来获取迭代器. 后面每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.

最新文章

  1. 让linux开机默认开启小键盘
  2. 前端开发必备!Emmet使用手册
  3. Atitit 修改密码的功能流程设计 attilax总结
  4. Android虚拟机Classic qemu does not support SMP问题记录
  5. java对txt文件内容追加
  6. 【Properties文件】Java使用Properties来读取配置文件
  7. SNM2无法编辑HostGroup项
  8. HFile解析 基于0.96
  9. 让wordpress分类和标签的描述支持HTML代码
  10. 基于Jquery的banner轮播插件,简单粗暴
  11. Python学习之--异常处理
  12. C程序设计语言练习题1-1
  13. 超人学院Hadoop大数据资源共享
  14. IZT复杂电磁环境记录回放和模拟系统
  15. 算法笔记-exgcd
  16. Windows安装docker (带安装包)
  17. Chapter 3 Introduction to Objects and Input/Output
  18. HTML5 缓存
  19. cocos2dx的addChild接口设计
  20. BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)

热门文章

  1. oracle 数据库 存储过程
  2. python语法:
  3. odoo9 部署步详细步骤
  4. vue 引用其他组件
  5. Java反射 : Declared的作用 ( 例如 : getMethods和getDeclaredMethods )
  6. WebForm随笔
  7. ios,弹窗遮罩滚动穿透解决方案
  8. Error CS0579 Duplicate &#39;System.Reflection.AssemblyTitleAttribute&#39; attribute
  9. 2840 WIKIOI——评测
  10. 解析 MFC 中的 FromHandle