Python基础之迭代器
承蒙大家厚爱,我的《Go语言之路》的纸质版图书已经上架京东,有需要的朋友请点击 此链接 购买。
迭代器是Python中一个很基础很重要的知识点,迭代器相关知识点也是Python程序员的必须要掌握的。
迭代器
要理解装饰器,首先要从字面意思来说。
迭代
- 重复
- 下一次重复基于上一次的结果
软件开发就是典型的迭代更新。
讲迭代,我们就先来模拟一下迭代:
现在让我们使用while
循环来遍历出一个列表list1 = [1, 2, 3, 4, 5]
里面的所有元素。
index = 0
while index < len(list1):
print(list1[index])
index += 1
接下来用for
循环来:
for index in range(len(list1)):
print(l[index])
很显然,上面两种方式都能实现遍历一个列表里面的所有元素。但是,它们都依赖于列表的索引,如果我们要遍历一个没有索引的数据类型,比如说字典和集合。那应该怎么办呢?
你可能知道在Python中可以直接使用for去遍历一个列表、元祖、字典、集合等数据类型。就像下面这样:
for i in list1: # 不依赖索引就能取出list1中的所有元素
print(i)
那么在Python中,上面的for循环究竟是怎么实现的呢?
其实跟我们今天要讲的迭代器有非常重要的关系。接下来,我们就一步一步的来介绍下迭代器的相关内容。
可迭代对象
我们之前学过的能被for
循环的有字符串、列表、字典、元祖、集合、打开的文件句柄,这些对象有什么共同特点呢?共同点就是它们都有一个叫__iter__
的方法。
总结一下:
只要一个对象有__iter__
方法,那么这个对象就可以叫做可迭代对象。
字符串、列表、字典、元祖、集合、打开的文件句柄都是可迭代对象。
再简单、直白一点?在Python中能够被for循环的都是可迭代对象。
迭代器
上面说到的那些有__iter__
方法的对象,如果调用一下这个特殊的__iter__
方法会发生什么呢?
补充:
dict1 = {"a": 1, "b":2, "c":3}
# 相当于执行了dict.__iter__(),类似len(dict1)相当于dict.__len__()
d = iter(dict1)
那执行iter(dict1)或者说调用dict1.__iter__
方法得到的是什么呢?
得到的就是一个迭代器,它有一个特殊的方法,叫__next__
方法。
总结一下:
只要一个对象有__iter__
方法和__next__
方法,那么这个对象就可以叫做迭代器。
对一个可迭代对象调用它的__iter__
方法,得到的就是迭代器对象。
总结一下:
迭代器的特点
优点:
- 不依赖索引
- 惰性计算,节省内存
缺点:
- 不如按索引取值方便
- 一次性,只能往后取,不能往回退
for循环实质
for i in [1, 2, 3, 4, 5]:
...
相当于:
i = [1, 2, 3, 4, 5].__iter__() # 获得迭代器
while True: # 循环
try:
x = i.__next__() # 获得下一个值
except StopIteration:
break # 遇到StopIteration就退出循环
内置方法介绍:
无限记数:
from itertools import count
counter = count(start=13)
print(next(counter))
13
print(next(counter))
14
环状迭代:
from itertools import cycle
colors = cycle(["红", "黄", "绿"])
print(next(colors))
红
print(next(colors))
黄
print(next(colors))
绿