login
欢迎访问QkqBeer博客园!

迭代器(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].

  

posted @ 2018-12-19 10:15  BeerQkq  阅读(178)  评论(0编辑  收藏  举报