码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程-协程-1、迭代器

时间:2018-07-30 14:42:00      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:参数   top   字典   pre   示例   div   不能   怎么   return   

知识点:什么叫迭代器?说起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

 

网络编程-协程-1、迭代器

标签:参数   top   字典   pre   示例   div   不能   怎么   return   

原文地址:https://www.cnblogs.com/lz-tester/p/9390101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!