类对象特殊方法——iter()、next()
之所以for-in语句可以用于某些内置类对象(例如:list、tuple、str等)的实例对象,是因为这些内置类对象中都实现了特殊方法__iter__()和__next__()。
>>> L = [1, 2, 3, 4, 5]
>>> for item in L:
... print(item)
...
1
2
3
4
5
for-in语句在默认情况下不能用于自定义类对象的实例对象。
>>> class MyClass(object):
... pass
...
>>> for item in MyClass():
... print(item)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'MyClass' object is not iterable
如果想让for-in语句可以用于自定义类对象的实例对象,必须在自定义类对象中实现特殊方法__iter__()和__next__()。
for-in语句首先会调用 特殊方法__iter__()返回一个可迭代对象,然后不断调用可迭代对象的特殊方法__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环。
只实现了特殊方法__iter__()的类对象,被称为可迭代对象;同时实现了特殊方法__iter__()和__next__()的类对象,被称为迭代器类对象
#!/usr/bin/python3
class MyClass(object):
def __init__(self, data):
self.data = 0
def __iter__(self): # 先自动调用__iter__()返回一个可迭代对象。如果没有这个方法,则依然会报TypeError: 'MyClass' object is not iterable错误
return self
def __next__(self): # 再自动调用__next__()依次返回可迭代对象的值,注意设置退出迭代条件,否则容易死循环
if self.data >= 5:
raise StopIteration
else:
self.data += 1
return self.data
mc = MyClass(5)
for i in mc:
print(i)
[root@lyucan ~]# ./iter.py
1
2
3
4
5
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com