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

    迭代器:

    迭代器:从集合的第一个元素开始访问,到所有的元素都被访问完 ,结束,不能后退,只能往前;
    迭代器的优点:不需要准备所有的元素;只有在迭代时才放入迭代器;元素之前或者之后的元素可以不存在或者时被销毁了,这个特点特别适用于遍历一个巨大的或者无限大的集合,如几个G的文件;
    vi 需要准备好文件(也就是全部读取到内存里面去,当用vi去打开文件,当用cat则不同,他是通过迭代的形式来查看文件的;(从头往后的)
    cat是读一行显示一行;不需要知道中间是什么,可以节省内存,只需关心next的值;
    
    1:无需关心内部结构,仅需通过next()方法获取下一个值
    2:布恩那个随机访问集合中的某一个元素;,只能从头开始访问
    3:访问到一半是不能后退
    4:节省内存,便于循环访问比较大的集合
    
    读文件时不要用:
    for i f.readlines 或者是for i in f.read(); 应该直接用for i in f:
    
    生成器:generator
    如果一个函数调用时返回的事一个迭代器,这个函数叫做生成器;
    yield:
    return 是:
    def cash_out(amount):
        while(amount >0)
        amount -=1
        return 1
        #yield 1
        print ('you are ok')
    
    
    迭代器:
    name1 = ['alex','bluesli','blueslilu']#列表的生成
    name2 = iter(['alex','bluesli','blueslilu'] )#生成一个迭代器对象
    print(name1)
    print(name2.__next__()) #2.7的是直接next而3.x是__next__()
    print(name2.__next__())
    print(name2.__next__())
    生成器:
    
    
    def cash_out(amount):
        while amount >0:
            amount -=100
            # return 1
            yield 100
            print ('又来取钱了')
    
    
    atm= cash_out(500)#这一步没有正正的执行,知识生成了一个迭代器;
    print(type(atm))
    print(atm.__next__())
    print(atm.__next__())
    print('大保健....')
    print(atm.__next__())
    print(atm.__next__())
    print(atm.__next__())
    
    #通过yield可以生成一个迭代器;
    # 异步的需求
    #函数执行了一半去干别的事情,回来之后还能回到断点;
    # 生成器简单的实现了一个异步的需求,可以保存程序的断点;
    # 第一次是显示100(yield会直接返回)当进入下一次继续来执行的时候又回到yield的断点,继续执行下面的内容),第二次是又来取钱了再取钱,然后yield,接下来就是重复了,
    
    
    
    
  • 相关阅读:
    python-字典
    C#公历转农历算法
    GridView控件显示图片
    SQLite DBHelp
    面向服务体系结构:适用于敏捷的系统
    针对 .NET 框架的安全编码指南
    Microsoft .NET Pet Shop 4
    C#.NET数据库访问类DBHelper
    Emgu CV 高斯建模
    .NET代码编写规范 整理
  • 原文地址:https://www.cnblogs.com/bluesl/p/9079690.html
Copyright © 2011-2022 走看看