- iterator和iterable
- 如果需要对象可以作为 for in关键字或者join函数的参数,需要这个对线是一个可迭代对象即这个对象是iterable的
- python中可迭代对象(如list, str, dict, generator)是实现了 iter方法的对象,iter方法返回一个iterator(即实现了next方法的对象)
""" To create an iterator in Python, there are two abstract classes from the built- in `collections` module - Iterable,Iterator. We need to implement the `__iter__()` method in the iterated object (collection), and the `__next__ ()` method in theiterator. """ class AlphabeticalOrderIterator(Iterator): """ Concrete Iterators implement various traversal algorithms. These classes store the current traversal position at all times. """ """ `_position` attribute stores the current traversal position. An iterator may have a lot of other fields for storing iteration state, especially when it is supposed to work with a particular kind of collection. """ _position: int = None """ This attribute indicates the traversal direction. """ _reverse: bool = False def __init__(self, collection: WordsCollection, reverse: bool = False) -> None: self._collection = collection self._reverse = reverse self._position = -1 if reverse else 0 def __next__(self): """ The __next__() method must return the next item in the sequence. On reaching the end, and in subsequent calls, it must raise StopIteration. """ try: value = self._collection[self._position] self._position += -1 if self._reverse else 1 except IndexError: raise StopIteration() return value class WordsCollection(Iterable): """ Concrete Collections provide one or several methods for retrieving fresh iterator instances, compatible with the collection class. """ def __init__(self, collection: List[Any] = []) -> None: self._collection = collection def __iter__(self) -> AlphabeticalOrderIterator: """ The __iter__() method returns the iterator object itself, by default we return the iterator in ascending order. """ return AlphabeticalOrderIterator(self._collection) def get_reverse_iterator(self) -> AlphabeticalOrderIterator: return AlphabeticalOrderIterator(self._collection, True) def add_item(self, item: Any): self._collection.append(item) if __name__ == "__main__": # The client code may or may not know about the Concrete Iterator or # Collection classes, depending on the level of indirection you want to keep # in your program. collection = WordsCollection() collection.add_item("First") collection.add_item("Second") collection.add_item("Third") print("Straight traversal:") print("\n".join(collection)) print("") print("Reverse traversal:") print("\n".join(collection.get_reverse_iterator()), end="")
Python杂项
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...