• python之路之迭代器与生成器


    一  迭代器

    那么在研究迭代器之前首先应该要知道什么是迭代。

    迭代:是一个重复的过程,并且每次重复都是建立基于上一次的结果而来的,所以在迭代的过程其实是在不断变化的。

    迭代器:就是迭代取值的工具。

    那么对于这个工具的使用,在python使用迭代的方法就是使用内置的——iter——,换言之就是说能够调用该方法的都叫可迭代的对象

    那么对于迭代器的优缺点:

    优点就是:1 提供一种不依赖于索引的取之方式。

                      2 更加省内存,因迭代器运行时每次只取一个值,

    缺点:取值麻烦,只能一个一个取,而且只能向后取,全部的值只能取一次,没办法用len获取长度。

    迭代器对象:可迭代的对象执行--iter--方法得到的返回值即使迭代器对象。

    迭代器对象一定是可迭代的对象,而可迭代的对象不一定是迭代器对象。

    s='hello'
    inter_s=s.__iter__()
    while True:
        try:
             print(inter_s.__next__())
        except StopIteration:
            break
    那么一般平时比较常用的列表,字典,元组,file等都是可迭代对象,那么其中有一个比较特殊的就是file,因file本身就是迭代器对象既能调用--itrer也能调用--next--,

    调用iter时,结果还是它本身。


    迭代器最典型的例子就是for循环:

    for line in l:那么for循环首先对l做一个调用--iter--的操作,拿到迭代器,然后再通过调用--next--拿到返回值,赋值给line.


    for循环自动检测stopiteration。在值取尽时,结束for循环。


    二 生成器

    函数内含有yield关键字,再调用函数就不会执行函数体代码,拿到的返回值就是一个生成器对象。

    f=open('a.txt','r',)
    f.__next__()
    f.__iter__()
    def chicken():
        print('--------1')
        yield 1
        print('=======2')
        yield 2
        print('-----3')
        yield 3
    
    obj=chicken()
    print(obj)

    # print(obj.__next__())
    print(obj.__iter__().__next__())#生成器的本质就是迭代器
    print(obj.__iter__().__next__())
    print(obj.__iter__().__next__())
     

    生成器本质就是迭代器
    def rang():
        print('===')
        n = 0
        while True:
         yield n
         n+=1
    
    obj=rang()
    # print(obj)
    print(obj.__next__())
    print(obj.__next__())#第二次执行时会从yield开始,所以yield保持程序运行的状态。
    print(obj.__next__())
    # for item in obj:
    #     print(item)
    生成一种迭代器,相当于for循环

    def rang(start,stop,step):
        n=start
        while n<stop:
            yield n
            n+=step
    
    obj=rang(2,8,2)
    print(obj.__next__())
    print(obj.__next__())
    # for item in obj:
    #     print(item)
    
    
    就相当于
    for item in range(2,8,2):
        print(item)

    总结生成器:

    1 给我们提供一种自定义迭代器的方式,可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器。

    2 yield可以象return一样用于返回值,区别是return只能返回一次值,而yield可以返回多次,因程序遇见return就会结束,yield可以保存函数的一个执行状态。


    协程函数:
    #yield关键字的另外一种使用形式:表达式形式的yield
    def eater(name):
        print('%s 准备开始吃饭啦' %name)
        food_list=[]
        while True:
            food=yield food_list
            print('%s 吃了 %s' % (name,food))
            food_list.append(food)
    
    g=eater('Feng')
    g.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g)
    g.send('烤鸡')
    g.send('烤鸭')
    g.send('猴脑')
    g.send('熊掌')
    g.close()
    g.send('鱼刺')
    g.send('鲍鱼')


    面向过程编程:
    优点:将复杂流程化,进而简化。

    缺点:修改一个阶段,可能其他阶段也要修改,所以容错率低,改进麻烦。

  • 相关阅读:
    卫星列表
    常见28个问题处理方法
    Dr.COM EPortal 认证
    Linux命令--chroot
    2020 最好的Linux网络监控工具
    auditctl(8)
    ElasticSearch 7.1.1 集群环境搭建
    ElasticSearch 常用 curl 命令
    利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性
    java根据数据库自动生成JavaBean或pojo
  • 原文地址:https://www.cnblogs.com/zhangsanfeng/p/8678430.html
Copyright © 2020-2023  润新知