• 可迭代对象、迭代器和生成器


    可迭代对象和迭代器:

     1 """
     2 可迭代对象包括迭代器、序列(字符串、列表、元组)和字典
     3 可迭代对象:要么实现__iter__方法,返回该可迭代对象的迭代器类实例,要么实现了__getitem__方法,并且参数是从零开始的索引
     4 迭代器:实现了__iter__方法,返回迭代器本身,且实现了__next__方法,返回下一个元素,若没有元素抛出StopIteration异常
     5 """
     6 
     7 
     8 class MyList(object):                       # 定义可迭代对象类(__iter__方法)
     9     def __init__(self, num):
    10         self.data = num
    11 
    12     def __iter__(self):
    13         return MyListIterator(self.data)    # 返回该可迭代对象的迭代器类实例
    14 
    15 
    16 class MyListIterator(object):              # 定义迭代器类(__iter__方法和__next__方法)
    17     def __init__(self, data):
    18         self.data = data
    19         self.now = 0
    20 
    21     def __iter__(self):
    22         return self                         # 返回迭代器本身
    23 
    24     def __next__(self):
    25         while self.now < self.data:
    26             self.now += 1
    27             return self.now-1               # 返回下一个元素
    28         raise StopIteration
    29 
    30 
    31 def main():
    32     my_list = MyList(5)
    33     print(type(my_list))
    34 
    35     my_list_iter = iter(my_list)
    36     print(type(my_list_iter))
    37 
    38     for i in my_list:
    39         print(i)
    40 
    41 
    42 if __name__ == '__main__':
    43     main()
    44 
    45 """
    46 结果:
    47 <class '__main__.MyList'>
    48 <class '__main__.MyListIterator'>
    49 0
    50 1
    51 2
    52 3
    53 4
    54 """

    生成器:

     1 """
     2 生成器:一种特殊的迭代器,自动实现了“迭代器协议”(__iter__和__next__方法)
     3 """
     4 
     5 
     6 def my_generator(num):                  # 定义生成器
     7     now = 0
     8     while now < num:
     9         temp = (yield now)
    10         now = now + 1 if temp is None else temp
    11 
    12 
    13 def main():
    14     my_gen = my_generator(5)
    15     print(type(my_gen))
    16     print(dir(my_gen))                    # 返回该对象拥有的方法名
    17 
    18     print(next(my_gen))
    19     print(next(my_gen))
    20 
    21     my_gen.send(3)                        # 重置当前迭代值
    22     print("my_gen.send(3)")
    23     print(next(my_gen))
    24 
    25 
    26 if __name__ == '__main__':
    27     main()
    28 
    29 """
    30 结果:
    31 <class 'generator'>
    32 ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
    33 0
    34 1
    35 my_gen.send(3)
    36 4
    37 """
  • 相关阅读:
    Linux 进程--父进程查询子进程的退出状态
    Node.js的require()的工作原理
    SSH免密码登录
    Nginx 配置 HTTPS自签名证书
    加密算法
    java.sql.SQLException: The user specified as a definer ('userxxx'@'%') does not exist
    Unsupported major.minor version 52.0
    Java iBatis使用List类型参数(解决List为空的报错问题)
    Java使用iBatis批量插入数据到Oracle数据库
    Hive時間函數-年份相加減
  • 原文地址:https://www.cnblogs.com/java-learning-xx/p/13965621.html
Copyright © 2020-2023  润新知