迭代, 是一种循环遍历方式, 可迭代对象指的是能被遍历对象
并非所有的数据类型, 都可以使用迭代器
判断对象是否可以迭代
判断它是否继承自Iterable, 如果是, 则可以迭代
1.导入Iterable类
from collections import Iterable
2.使用isinstance判断继承关系
isinstance([11, 22, 33], Iterable)
结果返回true, 说明list可以迭代, 其他类型也可以使用此方法
迭代器实例
迭代器对象, 可以被for in循环遍历
class Classmate(object):
def __init__(self):
self.names = list()
self.current_num = 0
def add(self, name):
self.names.append(name)
def __iter__(self):
"""必须实现__iter__方法"""
return self # 必须返回一个对象, 该对象具有__iter__方法和__next__方法
def __next__(self): # next方法会自动被for调用, 返回每次迭代数据
if self.current_num < len(self.names):
ret = self.names[self.current_num]
self.current_num += 1
return ret
else:
raise StopIteration # 终止for, 否则不会停止
def main():
classmate = Classmate()
classmate.add("老王")
classmate.add("大王")
classmate.add("小王")
# 迭代此对象
for temp in classmate:
print(temp)
if __name__ == "__main__":
main()
list在生成后, 就占据大量的内存空间, 即使不被调用
普通的循环while循环做到, 但对象的遍历使用迭代器更方便
迭代器的优点, 是占用极小的内存空间, 它返回的是对象, 仅在被调用时生成迭代数据, 在某些情况下替代list ( 也可以用while替代list )
在py2中range返回的是list, 而xrange返回的是一个对象, 后者占用极小内存, 不过在py3中range已经改变, 返回的是对象
此外, 并不是只有for循环能接收可迭代对象, list, tuple等也可以, 在类型转换时, 内部其实用到了迭代器重新生成数据