zoukankan      html  css  js  c++  java
  • Python写一个对象,让它自己能够迭代

    仿写range()对象,对象是可迭代的:

     1 #!usr/bin/env python3
     2 # -*- coding=utf-8 -*-
     3 
     4 class myRange():
     5     #初始化,也叫构造函数
     6     def __init__(self,n):
     7         self.i = 0
     8         self.n = n
     9 
    10     #类中核心,返回了迭代器本身;
    11     def __iter__(self):
    12         return self
    13 
    14     #迭代器开始
    15     def __next__(self):
    16         if self.i < self.n:
    17             i = self.i
    18             self.i += 1
    19             return i
    20         else:
    21             raise StopIteration();
    22 print(dir(myRange(10)));
    23 a = myRange(10);
    24 print(dir(a)); #输出:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'i', 'n']
    25 
    26 if __name__ == "__main__":
    27     a = myRange(10)
    28     print("a=========>", next(a)); #0
    29     print("next a====>", next(a)); #1
    30     print("next a====>", next(a)); #2
    31     print("next a====>", next(a)); #3
    32     print("next a====>", next(a)); #4
    33     print("next a====>", next(a)); #5
    34     print("next a====>", next(a)); #6
    35     print("next a====>", next(a)); #7
    36     print("next a====>", next(a)); #8
    37     print("next a====>", next(a)); #9
    38     print("next a====>", next(a)); #发起raise StopIteraion()
    39     

     上面是用next()把迭代器的所有元素一个一个依次打印出来的,当然也可以用for循环循环出来. for i in x: print(i),然后再用next(a)就会发起raise StopIteration()。下面用列表尝试一下:

     1 #!usr/bin/env python3
     2 # -*- coding=utf-8 -*-
     3 
     4 class myRange():
     5     #初始化,也叫构造函数
     6     def __init__(self,n):
     7         self.i = 0
     8         self.n = n
     9 
    10     #类中核心,返回了迭代器本身;
    11     def __iter__(self):
    12         return self
    13 
    14     #迭代器开始
    15     def __next__(self):
    16         if self.i < self.n:
    17             i = self.i
    18             self.i += 1
    19             return i
    20         else:
    21             raise StopIteration();
    22 print(dir(myRange(10)));
    23 a = myRange(10);
    24 print(dir(a)); #输出:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'i', 'n']
    25 
    26 if __name__ == "__main__":
    27     b = myRange(10)
    28     print(list(b)) #全部打印出来了,后续没有元素了
    29     print("b===>next b", next(b)) #StopIteration.

    把迭代器里的所有元素装到列表中后,再调用next()也会发起:raise StopIteraion.

  • 相关阅读:
    COCOS2D-X中UI动画导致闪退与UI动画浅析
    使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
    algorithm 学习之 for_each
    cocos2dx 3.2 Touch Listen和menu回调实现截屏
    Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个
    python 装饰器模式 我的理解
    Https SSL Knowledge & how to get a self-signed certificate on ubuntu.
    公钥和私钥的理解
    Openwrt UCI 快捷切换SS 配置
    iptables ipset 实用命令
  • 原文地址:https://www.cnblogs.com/mafu/p/13539638.html
Copyright © 2011-2022 走看看