• 迭代器和生成器


    迭代器

    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件。

    特点:

    1、访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容。
    2、不能随机访问集合中的某个值,只能从头到尾一次访问。
    3、访问到一半时不能往回退。
    4、便于循环比较大的数据集合,节省内存

    生成一个迭代器

    names = iter(['alex','jack','rain'])
    print (names)
    print(names.__next__())
    print(names.__next__())
    print(names.__next__())
    print(names.__next__())
    # print (names.next())   //python2.7方法

    取钱

    def cash_money(amount):
        while amount >0:
            amount -=100
            yield 100
            print("又来取钱啦!")
    
    atm = cash_money(500)
    print (type(atm))

    yield生成器

    1、对比range 和 xrange 的区别

    >>> print range(10)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print xrange(10)
    xrange(10)

    如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。

    # 自定义生成器nrange
    def nrange(num):
        temp = -1
        while True:
            temp = temp + 1
            if temp >= num:
                return
            else:
                yield temp

    2、文件操作的 read 和 xreadlines 的区别
    read会读取所有内容到内存
    xreadlines则只有在循环迭代是才会获取

    # 基于next自定义生成器NReadlines
    def NReadlines():
        with open('log','r') as f:
            while True:
                line = f.next()
                if line:
                    yield line
                else:
                    return
    
    for i in NReadlines():
        print i
    
    
    # 基于seek和tell自定义生成器NReadlines
    def NReadlines():
        with open('log','r') as f:
            seek = 0
            while True:
                f.seek(seek)
                data = f.readline()
                if data:
                    seek = f.tell()
                    yield data
                else:
                    return
    
    for item in NReadlines():
        print item
    
    选择了奋斗,以后可以随时还有选择安逸的权力。 但选择了安逸,可能以后就不那么轻易还能有选择奋斗的权力。
  • 相关阅读:
    仅此一文让你明白ASP.NET MVC 之View的显示
    仅此一文让你明白ASP.NET MVC原理
    MVC4相关Razor语法以及Form表单
    关于jQuery UI 使用心得及技巧
    jQuery编程的最佳实践
    前端不为人知的一面--前端冷知识集锦
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    常用数据结构及复杂度
    初探12306售票算法
    ajax省市县三级联动
  • 原文地址:https://www.cnblogs.com/wtli/p/7779693.html
Copyright © 2020-2023  润新知