【python】 迭代器
1. 迭代器简介
for循环我们都知道是对可迭代对象进行循环的,那么什么是可迭代对象呢, 我们目前所知的可迭代对象有: list str tuple dict set
为什么他们被称为可迭代对象呢, 为什么int就不是可迭代对象呢?
因为这些可迭代对象都遵守可迭代协议,什么是可迭代协议? 先看一串代码
# 对的 s = "abc" for c in s: print(c)
# 错的 for i in 123: print(i) 结果:
Traceback (most recent call last): File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 8, in <module> for i in 123: TypeError: 'int' object is not iterable
报错信息中有一句话: 'int' object is not iterable. 这句话的意思是int类型对象不是可迭代的, iterable表示可迭代的, 表示可迭代协议.
那么如何让验证某一个数据类型是否符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有方法
s = '一个字符串' print(dir(s))
在打印结果中,我们如果找到了__iter__,那么它就是一个可迭代对象
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'capitalize', 'casefold',
'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal',
'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',
'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
找到了,证明s是一个可迭代对象
我们还可以通过isinstance()函数来查看某一个对象是否属于某种类型
如果确定对象中有__iter__函数,那么我们认为这个对象遵守可迭代协议,就可以获取到相应的迭代器. 这里的__iter__是帮助我们获取到对象的迭代器,我们使用__next__()来获取到一个迭代器中的元素
s = "我爱北京天安门" c = 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
__next__()是一次获取一个迭代器中的元素,如果迭代器中的元素已经获取完了,那么将不能再使用__next__(),否则将会报StopIteration错
迭代器实例: 模拟for循环
lst = [1,2,3,4,5,6] for i in lst: print(i) # 使用for循环对lst进行遍历 lst_iter = lst.__iter__() while 1: # 使用while和迭代器对lst进行遍历 try: i = lst_iter.__next__() print(i) except StopIteration: break
2. 迭代器的特点
说了这么多迭代器,那么迭代器到底有什么特点呢?
1. 节省内存
2. 惰性机制
3. 不可以返回,只能向下执行
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步