网络编程-协程-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

 

posted @ 2018-07-30 13:27  上海小盖伦  阅读(130)  评论(0编辑  收藏  举报