迭代器(python)(leetcode 284 python)
概述:迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
延迟计算或惰性求值 (Lazy evaluation)
迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
可迭代对象
迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。
序列:字符串、列表、元组
非序列:字典、文件
自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象
创建迭代器对象
使用内建的工厂函数iter(iterable)可以获取迭代器对象:
语法:
iter(collection) -> iterator
iter(callable,sentinel) -> iterator
说明:
创建迭代器对象
使用内建的工厂函数iter(iterable)可以获取迭代器对象:
语法:
从对象中获取迭代器。
在第一种形式中,参数必须提供它自己的迭代器,或者是一个序列。
在第二种形式中,调用被调用对象,直到它返回标记为止。
# Below is the interface for Iterator, which is already defined for you. # # class Iterator(object): # def __init__(self, nums): # """ # Initializes an iterator object to the beginning of a list. # :type nums: List[int] # """ # # def hasNext(self): # """ # Returns true if the iteration has more elements. # :rtype: bool # """ # # def next(self): # """ # Returns the next element in the iteration. # :rtype: int # """ class PeekingIterator(object): def __init__(self, iterator): """ Initialize your data structure here. :type iterator: Iterator """ self.iterator = iterator self.n = None def peek(self): """ Returns the next element in the iteration without advancing the iterator. :rtype: int """ if self.n == None: self.n = self.iterator.next() return self.n def next(self): """ :rtype: int """ if self.n != None: temp = self.n self.n = None return temp else: return self.iterator.next() def hasNext(self): """ :rtype: bool """ if self.n != None: return True else: return self.iterator.hasNext() # Your PeekingIterator object will be instantiated and called as such: # iter = PeekingIterator(Iterator(nums)) # while iter.hasNext(): # val = iter.peek() # Get the next element but not advance the iterator. # iter.next() # Should return the same value as [val].