美文网首页程序员python
Python 迭代器总结

Python 迭代器总结

作者: 亮哥007 | 来源:发表于2019-02-14 00:58 被阅读0次

    迭代器是Python一个强大的功能,它可以记录被迭代“对象”的位置,迭代器对象从集合的第一个元素开始访问数据,直到所有数据访问结束,迭代器有两个基本函数iter()和next()

    iter()用来生成迭代器
    next()用来返回迭代器的下一个数据
    

    Python内置模块itertools,提供了很多非常有用的函数。另外,迭代器结合生成器和闭包使用可以写出优雅的代码。
    举例:列表有100个数字,每次取10个数字打印

    import itertools
    
    def grouper(iterable, size):
        it = iter(iterable)
        while True:
            chunk = tuple(itertools.islice(it, size))
            if not chunk:
                return
            yield chunk
    
    data = [i for i in range(100)]
    for group in grouper(data, 10):
        print group
    

    我们看一下执行结果,对就是这么神奇!

    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    (20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
    (30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    (40, 41, 42, 43, 44, 45, 46, 47, 48, 49)
    (50, 51, 52, 53, 54, 55, 56, 57, 58, 59)
    (60, 61, 62, 63, 64, 65, 66, 67, 68, 69)
    (70, 71, 72, 73, 74, 75, 76, 77, 78, 79)
    (80, 81, 82, 83, 84, 85, 86, 87, 88, 89)
    (90, 91, 92, 93, 94, 95, 96, 97, 98, 99)
    

    这里有个问题需要特别注意

    迭代器在通过while表达式访问时,要注意捕获StopIteration异常,通过for表达访问时则不需要

    data1 = iter([i for i in range(2)])
    
    for d1 in data1:
        print 'data1 em = ', d1
    
    data2 = iter([i for i in range(2, 4)])
    while True:
        d2 = next(data2)
        print 'data2 em = ', d2
    
    print 'ok'
    

    运行上面代码,会抛出StopIteration异常

    data1 em =  0
    Traceback (most recent call last):
    data1 em =  1
    data2 em =  2
      File "/Users/zhangmingliang/PycharmProjects/jianshu/generator.py", line 8, in <module>
    data2 em =  3
        d2 = next(data2)
    StopIteration
    

    重构代码,捕获StopIteration异常

    data1 = iter([i for i in range(2)])
    
    for d1 in data1:
        print 'data1 em = ', d1
    
    data2 = iter([i for i in range(2, 4)])
    while True:
        try:
            d2 = next(data2)
            print 'data2 em = ', d2
        except StopIteration:
            print 'No data'
            break
    
    print 'ok'
    

    代码运行正常

    data1 em =  0
    data1 em =  1
    data2 em =  2
    data2 em =  3
    No data
    ok
    

    那么有哪些对象是可迭代的呢?

    除了Python内置的字符串、列表、元组、字典和文件等数据结构。我们可以自定义实现迭代对象,只要对象实现了iter()和next()两个方法,就可以被迭代访问

    class MyIter(object):
    
        def __init__(self, total, start=0):
            self.total = total
            self.start = start
    
        def __iter__(self):
            return self
    
        def next(self):
            if self.start < self.total:
                self.start += 1
                return self.start
            else:
                raise StopIteration
    
    myIter = MyIter(5)
    it = iter(myIter)
    for d in it:
        print d
    

    输出结果:

    1
    2
    3
    4
    5
    

    总结

    通过自定义迭代对象的代码我们可以看到,next()函数可以实现数据的懒加载,这个特性在大批量数据处理场景中非常有用,可以节省大量的内存占用并且提高程序性能

    相关文章

      网友评论

        本文标题:Python 迭代器总结

        本文链接:https://www.haomeiwen.com/subject/awojeqtx.html