迭代器1:
import time
class Classmates(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
"""如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
return ClassIterator(self)
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.obj.names):
ret = self.obj.names[self.current_num]
self.current_num += 1
return ret
else:
raise StopIteration
classmate = Classmates()
classmate.add("张三")
classmate.add("李四")
classmate.add("王五")
"""循环遍历一个对象:
for name in classmate:
pass
这两行代码可以解读为:
1.判断classmate是否可以迭代
2.在第1步成立的前提下,自动调用iter函数,得到classmate对象的__iter__方法的返回值
3.__iter__方法的返回值是一个迭代器
4.__iter__方法返回的是哪一个对象的引用,就执行哪一个对象对应的类中的__next__方法
"""
for name in classmate:
print(name)
time.sleep(1)
迭代器2:
import time
class Classmate(object):
def __init__(self):
self.names = list()
self.current_num = 0
def add(self, name):
self.names.append(name)
def __iter__(self):
return self
def __next__(self):
if self.current_num < len(self.names):
ret = self.names[self.current_num]
self.current_num += 1
return ret
else:
raise StopIteration
classmate = Classmate()
classmate.add("张三")
classmate.add("老王")
classmate.add("李四")
"""
for name in classmate:
print(name)
解读:
1.先判断classmate对象是否是可迭代对象(就看这个对象对应的类里面有没有__iter__方法)
2.如果是可迭代对象,自动调用iter函数进入到__iter__方法中,查看__iter__方法的返回值
3.__iter__方法返回什么(哪个对象),就执行它(哪个对象对应的类)下面的__next__方法代码(这里返回自身,就执行自己内部的__next__方法)
4.把__next__方法的返回值赋给name,此时name 就表示__next__方法的返回值
"""
for name in classmate:
print(name)
time.sleep(1)
迭代器的作用(重点):
"""使用for...in 来遍历fibonacci数列的前10个值
法一:使用列表先把斐波那契数列的前10个数存起来,再遍历
代码如下:
nums = list()
a = 0
b = 1
i = 0
while i < 10:
nums.append(a)
a, b = b, a + b
i += 1
for num in nums:
print(num)
法二:用迭代器实现,代码如下
比较:使用列表的方式要先往列表中存入数,数值太多时会占用大量的存储空间;
而使用迭代器的好处是 节省存储空间,因为迭代器里面存储的是不是数据本身,而是生成数据的方法,
只占用生成数据方法的几行代码空间,所以占用内存少
"""
class Fibonacci(object):
def __init__(self, all_num):
self.all_num = all_num
self.current_num = 0
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
if self.current_num < self.all_num:
ret = self.a
self.a, self.b = self.b, self.a + self.b
self.current_num += 1
return ret
else:
raise StopIteration
if __name__ == "__main__":
fibo = Fibonacci(10)
for num in fibo:
print(num)