因此,我最近在python类中了解了迭代器协议,并被告知__iter__(self)
方法应始终返回新的迭代器,而不是self
。在流畅的Python书中,它谈到了在迭代器中返回self
,所以我不确定为什么我的导师告诉我不能使用self作为返回值
这是我们在考试中遇到的一个例子,我因为使用self而不是FileName迭代器而丢了分数
class FileNamesIterator:
"""
Iterator that iterates over all the file names in the
FileNamesIterable.
"""
def __init__(self, filename_iterable: FileNamesIterable):
self.filename_iterable = filename_iterable
self.curr_index = 0
def __next__(self) -> str:
file_list = self.filename_iterable.file_list
if self.curr_index == len(file_list):
raise StopIteration()
next_file_name = file_list[self.curr_index]
self.curr_index += 1
if ".png" in next_file_name:
next_file_name = f"{next_file_name} - Portable Network Graphics " \
f"File"
elif ".gif" in next_file_name:
next_file_name = f"{next_file_name} - Graphics Interchange " \
f"Format File"
return next_file_name
def __iter__(self) -> FileNamesIterator:
return self
class FileNamesIterable:
def __init__(self, file_list: list):
self.file_list = file_list
def __iter__(self) -> FileNamesIterator:
return FileNamesIterator(self)
要在容器类中实现迭代器协议,需要向其添加
__iter__
方法。这允许使用for
循环对类实例进行迭代,因为它调用类实例上的iter()
来获取迭代器对象(从instance.__iter__()
,然后从返回的对象(迭代器)调用__next__
方法,直到它耗尽为止(引发StopIteration
,而不是返回另一个数据值)。这就是为什么__iter__
迭代器类的方法应返回带有__next__
方法的对象如果实现该协议的类本身可以有
__next__
方法,则可以从__iter__
返回self
:如果将迭代器类与iterable对象分开,则必须返回一个新的迭代器对象,而不是
self
(或迭代器类名):输出:
相关问题 更多 >
编程相关推荐