zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    迭代器

    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个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
    
    选择了奋斗,以后可以随时还有选择安逸的权力。 但选择了安逸,可能以后就不那么轻易还能有选择奋斗的权力。
  • 相关阅读:
    委托学习笔记一(调用委托)
    委托和事件— 一个虚构的故事
    WPF中控制窗口状态
    oracle创建DBLINK
    添加路由 route add
    通过脚本执行sql语句
    c#对声音系统的控制
    ProcessBuilder调用外部脚本
    sql server 重新编译所有视图
    silverlight 隐藏ChildWindow 右上角的关闭按钮
  • 原文地址:https://www.cnblogs.com/wtli/p/7779693.html
Copyright © 2011-2022 走看看