Python-迭代器-Python自学笔记4
本章重点
- 可迭代对象
- 迭代的概念
- 可迭代对象
- 判断一个对象是否是可迭代对象
- 迭代器
- 什么是迭代器
- 迭代器的作用
- 怎么生成一个迭代器
- 迭代器的用法
- 迭代器的优点
- 迭代器的缺点
可迭代对象
迭代的概念
学习可迭代对象前我们应该了解一下迭代的概念
以下是我在维基百科中找到的关于迭代的定义:
-
迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
-
用代码解释:
-
实例1----非迭代
-
i = 0 while i < 5: print("Python 是世界上最好的语言") i += 1 ```` -
实例2----迭代
-
i = 0 while i < 5: print(i) i += 1 -
上面这两段代码看着很相似,但是为什么实例1是非迭代而实例2却是迭代呢?其实是因为实例1仅仅是重复打印了5次
Python 是世界上最好的语言",它所输出的内容并不依赖上一次的数据,所以不能算迭代。 -
而实例2每次输出的结果都是基于上一次的数据
+=1所以是迭代。
-
可迭代对象
-
可迭代对象,并不是某种具体的数据类型,它是指存储了元素的一个容器对象。且这个容器对象包拥有
__iter__或__getitem__方法。 -
那么如何确定一个对象是否是可迭代对象:
思路:上面提到了,有
__iter__方法的对象就是可迭代对象,我们只需要查看这个对象的所有方法,再看里面有没有__iter__方法。我们可以使用python内置方法
dir()查看一个对象的所有方法。例如:
l = [1,2,3,4,5,6] print(dir(l))结果:
-
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']内置方法
dir()会获取对象的所有方法并返回一个列表,且列表内的每一个元素都是以字符串形式表现上方的返回结果里面有
__iter__和__getitem__方法,我们可以确定列表就是一个可迭代对象。但这样子一次性返回这么多方法,我们要一个个去看,这显然不够直观,现在我们用我们以前学过的内容,搭配dir()方法确定该对象是不是可迭代对象。自己先尝试写一下,写完再点开看
print(('__iter__' in dir(l)) or ('__getitem__' in dir(l))) 结果 >>> True
-
迭代器
什么是迭代器
GOF给迭代器的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
迭代器就是为了实现不同集合进行统一遍历的一种机制。
内部含有 __next__ 方法的对象都是迭代器
迭代器的作用
从上面这句定义我们可以看出 迭代器 就是为了容器而生,而迭代器需要做的事就是将容器中的元素一个一个取出来。
怎么创建迭代器对象(两种方法)
创建迭代器之前,我们需要先知道,用于创建迭代器的对象必须是可迭代对象,
如 str list dict set 等,这种可迭代对象都可以用于创建迭代器。
-
使用内置函数创建迭代器对象 (
iter(obj))-
li = [1, 2, 3, 4] iter_obj = iter(li) # 迭代器对象
-
-
使用对象方法创建迭代器对象 (
obj.__iter__())-
str_ = "Hello Python" iter_obj = str_.__iter__() # 迭代器对象
-
迭代器的用法
迭代器是不能直接查看里面的元素的,需要使用 next(iter_obj) 进行取值,且使用一次next() 取一个元素,且取值次数只能和元素个数一样,否则将报 StopIteration 错误
迭代器里的每个元素只能取值一次,所以不能还原迭代器,也就是说迭代器里面的元素取完了,这个迭代器就不能再次使用了。
实例:
-
# 创建一个列表 li = [1, 2, 3, 4] # 创建这个列表的迭代器对象 li_iter = iter(li) # 取值 # 取值也可以使用 li_iter.__next__() 方法 print(next(li_iter)) print(next(li_iter)) print(next(li_iter)) print(next(li_iter)) -
结果:
1234
现在我们利用while 循环来模拟一下 for 循环遍历。
-
li = [1, 2, 3, 4, 5, 6, 7, 8, 9] iter_obj = iter(li) while 1: try: # 异常捕获 print(next(iter_obj)) except StopIteration: # 如果报了StopIteration错误就执行break break -
结果:
12...345678 # 让我偷一下懒9
迭代器的优缺点
- 优点:
- 节约内存
- 惰性机制,一次只取一个值。
- 缺点:
- 速度慢
- 不能恢复迭代器,即同一个元素只能取一次。

浙公网安备 33010602011771号