迭代器:是一种不依赖索引的访问和获取数据的方式,能被for循环遍历。适合遍历数据量巨大甚至无须的序列。
1>>>任意一个可迭代对象,通过调用内置函数 itre(score),可以变成一个迭代器。
2>>>面向对象思想,通过__iter__和__next__两个魔术方法定义一个迭代器的类。
测试代码1:
t = (1, 1.1, "2", "a", "cd") # 定义一个元组
it1 = iter(t) # 通过内置函数iter(score)将可迭代对象元组变成迭代器
for _ in range(len(t)):
print(it1.__next__()) # 使用迭代器对象下的魔法方法遍历数据obj.__next__()
l = list(t) # 定义一个列表
it2 = iter(l) # 通过内置函数iter(score)将可迭代对象列表变成迭代器
for _ in range(len(l)):
print(next(it2)) # 使用Python解释器自带的迭代函next(obj)数遍历数据
s = set(l) # 定义一个集合
for item in s:
print(item) # for循环直接遍历数据
上面3个for遍历结果一致,输出如下:
>>> 1
>>> 1.1
>>> 2
>>> a
>>> bc
测试代码2:
class NumPow(object): # 定义一个迭代器的类:生成1,2,3,4,5,...的平方
value = 0
def __iter__(self): # 实现了方法__iter__的类实例是可迭代的
return self # 链式调用,不断返回"自身对象"同时被不断调用
def __next__(self): # 同时实现了方法__next__的类对象是迭代器
if self.value > 10: # 设置判断条件,防止无限性循环
raise StopIteration
self.value += 1
return self.value ** 2 # 返回值的平方
if __name__ == '__main__':
np = NumPow() # 生成一个迭代器的类对象
# for i in range(10):
# print(np.__next__())
# for j in range(10):
# print(next(np))
for i in np: # 因为__iter__不断调用自身,对象可迭代的
print(i)
测试代码3:如何理解__iter__函数返回自身对象
class CallMe(object):
def __init__(self):
self.num = 0
def call_self(self): # 类中定义一个返回自己的方法
self.num += 1
return self # 返回自己,自己就是一个对象,可继续调用自己的方法
if __name__ == '__main__':
callMe = CallMe()
print(callMe.num) >>> 0 起始值为0
print(callMe) >>> <__main__.CallMe object at 0x0000000001E507B8>
print(callMe.call_self().call_self()) >>> <__main__.CallMe object at 0x0000000001E507B8>
""" 连续调用2次,返回的还是自身 """
print(type(callMe.call_self())) >>> <class '__main__.CallMe'>
""" 打印类对象 """
print(callMe.num) >>> 3 上面call_self()调用3次
迭代器必不可少的是__iter__()方法,该方法返回的是一个迭代对象,也就是当前的的对像。
Python的for循环就可以不断调用该迭代对象,通过__next__()方法,拿到循环的下一个值。
本文深入解析了迭代器的概念,包括其如何不依赖索引访问数据,以及如何通过__iter__和__next__方法实现自定义迭代器。通过具体代码示例,展示了迭代器在Python中的实现方式和遍历过程。
753

被折叠的 条评论
为什么被折叠?



