1. 程式人生 > 其它 >python迭代器理解

python迭代器理解

技術標籤:多工python

python迭代器理解

# -*- coding:UTF-8 -*-
from collections import Iterable,Iterator

class Classmate(object):
    def __init__(self):
        self.name = list()
    def __add__(self, name):
        self.name.append(name)
    def __iter__(self):
        #如果想要一個物件稱為一個可以迭代的物件,既可以使用for,那麼必須實現__iter__方法
return ClassIterator() class ClassIterator(object): def __iter__(self): pass def __next__(self): return 11 classmate = Classmate() classmate.__add__('張三') classmate.__add__('李四') classmate.__add__('王五') #程式判斷的流程 print('判斷classmate是否是可以迭代的物件:',isinstance(classmate,
Iterable)) classmate_iterator = iter(classmate) print('判斷classmate_iterator是否是迭代器:',isinstance(classmate_iterator,Iterator)) print(next(classmate_iterator)) #next(classmate_iterator 表示呼叫classmate_iterator中的next方法 for name in classmate: print(name)

for是否可以使用的判斷流程如下:

print('判斷classmate是否是可以迭代的物件:'
,isinstance(classmate,Iterable)) classmate_iterator = iter(classmate) print('判斷classmate_iterator是否是迭代器:',isinstance(classmate_iterator,Iterator))

如果想要一個物件稱為一個可以迭代的物件,既可以使用for,那麼必須實現__iter__方法。
首先判斷Classmate類中是否有__iter__方法,如果有,那麼classmate就是可以迭代的物件,接下來在__iter__方法中例項化ClassIterator(在__iter__方法中return ClassIterator())如果ClassIterator類中有__next__方法,那ClassIterator就是是迭代器。至此判斷完成。
執行結果:
在這裡插入圖片描述
完善迭代器

# -*- coding:UTF-8 -*-
from collections import Iterable,Iterator

class Classmate(object):
    def __init__(self):
        self.names = list()
    def __add__(self, name):
        self.names.append(name)
    def __iter__(self):
        #如果想要一個物件稱為一個可以迭代的物件,既可以使用for,那麼必須實現__iter__方法
        return ClassIterator(self)

class ClassIterator(object):
    def __init__(self,obj):
        self.obj = obj
        self.current_num = 0
    def __iter__(self):
        pass
    def __next__(self):
        if self.current_num < len(self.obj.names):
            ret = self.obj.names[self.current_num]
            self.current_num += 1
            return ret
        else:
            raise StopIteration
classmate = Classmate()
classmate.__add__('張三')
classmate.__add__('李四')
classmate.__add__('王五')

#程式判斷的流程
#print('判斷classmate是否是可以迭代的物件:',isinstance(classmate,Iterable))
#classmate_iterator = iter(classmate)
#print('判斷classmate_iterator是否是迭代器:',isinstance(classmate_iterator,Iterator))
#print(next(classmate_iterator))  #next(classmate_iterator 表示呼叫classmate_iterator中的next方法

for name in classmate:
    print(name)

執行結果:
在這裡插入圖片描述
優化迭代器:

# -*- coding:UTF-8 -*-
from collections import Iterable,Iterator

class Classmate(object):
    def __init__(self):
        self.names = list()
        self.current_num = 0
    def __add__(self, name):
        self.names.append(name)
    def __iter__(self):
        #如果想要一個物件稱為一個可以迭代的物件,既可以使用for,那麼必須實現__iter__方法
        #return ClassIterator(self)
        return self #返回自己
    def __next__(self):
        if self.current_num < len(self.names):
            ret = self.names[self.current_num]
            self.current_num += 1
            return ret
        else:
            raise StopIteration

'''
class ClassIterator(object):
    def __init__(self,obj):
        self.obj = obj
        self.current_num = 0
    def __iter__(self):
        pass
    def __next__(self):
        if self.current_num < len(self.obj.names):
            ret = self.obj.names[self.current_num]
            self.current_num += 1
            return ret
        else:
            raise StopIteration
'''
classmate = Classmate()
classmate.__add__('張三')
classmate.__add__('李四')
classmate.__add__('王五')

#程式判斷的流程
#print('判斷classmate是否是可以迭代的物件:',isinstance(classmate,Iterable))
#classmate_iterator = iter(classmate)
#print('判斷classmate_iterator是否是迭代器:',isinstance(classmate_iterator,Iterator))
#print(next(classmate_iterator))  #next(classmate_iterator 表示呼叫classmate_iterator中的next方法

for name in classmate:
    print(name)

執行結果
在這裡插入圖片描述