1. 程式人生 > >python:自定義類中迭代行為的實現

python:自定義類中迭代行為的實現

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author : cat
# @date   : 2017/6/23.


class Squares:
    """
    單(個活躍的)迭代器的實現
    """

    def __init__(self, start, stop):
        self.value = start - 1
        self.stop = stop
        print("s1 init ---- ", start, stop)

    def __iter__(self):
        print('s1: _iter_'
) return self def __next__(self): print("s1: _next_") if self.value == self.stop: raise StopIteration self.value += 1 return self.value ** 2 class Squares2: """ 多(個活躍的)迭代器的實現 """ def __init__(self, start, stop): self.start = start self.value = start - 1
self.stop = stop print("init: ", start, stop) def __iter__(self): """ 重寫該方法,讓自己成為:iterable :return: """ print("__iter__ -- ") return Squares2(self.value + 1, self.stop) def __next__(self): """ 重寫該方法,讓自己成為:iterator :return: """
print("__next__") if self.value == self.stop: raise StopIteration self.value += 1 return self.value ** 2 if __name__ == '__main__': s1 = Squares(1, 4) # 一次遍歷僅呼叫一次 __iter__ 方法 print([x for x in s1]) # 一次遍歷中,每返回一個值,都會呼叫一次__next__方法 print("\n-------------\n") s2 = Squares2(1, 4) print([x for x in s2]) print([x for x in s2])

輸出如下:

iterttt.py

s1 init ----  1 4
s1: _iter_
s1: _next_
s1: _next_
s1: _next_
s1: _next_
s1: _next_
[1, 4, 9, 16]
s1: _iter_
s1: _next_
[]

-------------

init:  1 4
__iter__ -- 
init:  1 4
__next__
__next__
__next__
__next__
__next__
[1, 4, 9, 16]
__iter__ -- 
init:  1 4
__next__
__next__
__next__
__next__
__next__
[1, 4, 9, 16]

Process finished with exit code 0