zoukankan      html  css  js  c++  java
  • 网络编程-协程-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
  • 相关阅读:
    LeetCode:204. 计数质数
    LeetCode:203. 移除链表元素
    LeetCode:202. 快乐数
    LeetCode:191. 位1的个数
    LeetCode:190. 颠倒二进制位
    LeetCode:189. 旋转数组
    LeetCode:187. 重复的DNA序列
    LeetCode:165. 比较版本号
    LeetCode:164. 最大间距
    LeetCode:155. 最小栈
  • 原文地址:https://www.cnblogs.com/lz-tester/p/9390101.html
Copyright © 2011-2022 走看看