zoukankan      html  css  js  c++  java
  • 第七节 可迭代对象

     1 from collections.abc import Iterable
     2 from collections.abc import Iterator
     3 
     4 # 判断是否是可迭代对象
     5 print(isinstance([11, 22, 33], Iterable))
     6 
     7 class Classmate(object):
     8     def __init__(self):
     9         self.name = list()
    10 
    11     def add(self, name):
    12         self.name.append(name)
    13 
    14     def __iter__(self):
    15         """要使一个对象变成可迭代对象,必须调用这个方法"""
    16         return ClassIterator(self)  #将ClassIterator类实例化的一个对象当作返回值
    17 
    18 
    19 class ClassIterator():
    20 
    21     def __init__(self, obj):
    22         self.obj = obj.name
    23         self.num = 0
    24     def __iter__(self):
    25         pass
    26 
    27     def __next__(self):
    28         if self.num <= len(self.obj):  #设置if条件,让原来的for不会一直重复取同一个值
    29             ret = self.obj[self.num]
    30             self.num += 1
    31             return ret
    32         else:
    33             raise StopIteration  #抛出异常,for取数,如果没有这句话,for取完数后,会一直取__next__(self)返回的none
    34 
    35 classmate = Classmate()
    36 classmate.add("111")
    37 classmate.add("222")
    38 classmate.add("333")
    39 
    40 print(isinstance(classmate, Iterable))  # 判断是否是可迭代对象
    41 classmate_iterator = iter(classmate)  #iter函数会自动调用classmate中的__iter__方法,取得其返回值,如果返回对象中有__next__(self)方法,则返回该对象的地址,否则报错
    42 print(isinstance(classmate_iterator, Iterator))  #判断是否是迭代器
    43 for x in classmate:
    44     print(x)
    45 
    46 '''
    47 最终版,将两个类合并
    48 '''
    49 class Classmate(object):
    50     def __init__(self):
    51         self.name = list()
    52         self.num = 0
    53     def add(self, name):
    54         self.name.append(name)
    55 
    56     def __iter__(self):
    57         """要使一个对象变成可迭代对象,必须调用这个方法"""
    58         return self  # 这里将自己的引用作为返回值,让人for循环会自动调用iter()函数,从这个引用里找到__next__(self)方法,执行
    59     def __next__(self):
    60         if self.num <= len(self.name ):  # 设置if条件,让原来的for不会一直重复取同一个值
    61             ret = self.name [self.num]
    62             self.num += 1
    63             return ret
    64         else:
    65             raise StopIteration  # 抛出异常,for取数,如果没有这句话,for取完数后,会一直取__next__(self)返回的none
  • 相关阅读:
    IIS6.0PUT漏洞的利用
    练习1--利用python获取百度前3页搜索结果(可更改页数)
    笔记整理6——用python实现IP流量分析
    Django ORM 那些相关操作
    Django 中得ORM介绍和字段及字段参数
    Django 的 路由系统
    Django
    Django 的 之 视图
    Django 框架
    Django 中ORM 的使用
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12575488.html
Copyright © 2011-2022 走看看