网络编程-协程-1、迭代器
知识点:什么叫迭代器?说起for遍历大家应该很熟悉,for i in xxx,in后面的对象是一个可迭代的对象,可迭代的对象不一定是迭代器,如列表,字典,字符串等这些都是可迭代对象,迭代器是调用了对象内部的__iter__方法和__next__方法,(不能说只要是迭代器就一定调用了__iter__和__next__,因为后面说到的生成器就不需要调用这俩个方法,而生成器是个特殊的迭代器)
1、代码示例,详情看注解:
"""需求:将一个类里面的列表通过迭代器方式打印出来""" class Test1(object): def __init__(self): self.list = [] self.flag = 0 def add_num(self,num): self.list.append(num) def __iter__(self): # 迭代器必须定义__iter__方法,这个方法是自动调用的,方法里面必须有个返回的对象, # 这个对象调用__next__ 方法 return self def __next__(self): # 迭代器必须定义__next__方法,这个方法也是自动调用的,也必须有一个返回的对象,这个对象就是需求中列表中的值 if self.flag < len(self.list): ret = self.list[self.flag] self.flag += 1 return ret else: raise StopIteration # 主动抛出异常,当列表的值取完之后,就会结束程序,不加这句代码会一直去取空值
# 创建迭代器对象,并向类表中添值
obj = Test1()
obj.add_num('张三')
obj.add_num('李四')
obj.add_num('王五')
for i in obj: # in后面此时不是可迭代对象了,是一个迭代器
print(i)
运行结果:
张三
李四
王五
2、怎么判断for ......in ......的in后面的对象是不是一个可迭代对象或者是一个迭代器呢?用instance方法就可以去判断,看下面示例:
from collections import Iterator,Iterable # Iterator迭代器,Iterable可迭代对象 a = [1, 2, 3, 4, 5] print(isinstance(a, Iterable)) # instance方法里第一个参数是要判断的对象,第二个参数是判断是不是迭代器或者可迭代对象,根据自己需要去填 # 会返回一个bool值,True则是,False则不是,示例 # 示例判断是不是一个可迭代对象,返回了True print(isinstance(a,Iterator)) # 判断是不是一个迭代器,返回了False
3、下面利用迭代器做一下菲波那切数列:
class Fibonaqie(object): def __init__(self,num): self.a, self.b = 0, 1 self.num = num self.flag = 0 def __iter__(self): return self def __next__(self): if self.flag < self.num: ret = self.a self.a, self.b = self.b, self.a+self.b self.flag += 1 return ret else: raise StopIteration obj = Fibonaqie(10) for i in obj: print(i)
运行结果:
0
1
1
2
3
5
8
13
21
34