python迭代器理解
阿新 • • 發佈:2020-12-29
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)
執行結果