zoukankan      html  css  js  c++  java
  • 迭代器 生成器 面向过程编程


    迭代器
    什么是迭代器(iterator)?
    器值得某种工具
    迭代,指的是更新换代的过程,例如应用程序的版本更新,从1.0编程1.1在变成1.2
    迭代的目的是要根据上一个结果,产生下一个结果,这是一个重复的过程 ,但不是单纯的重复
    迭代器就是根据上一个结果得到下一个结果的工具,简单的说就是获取数据的工具

    可迭代对象
    指的就是可以使用迭代器取出数据的对象,
    如何判断一个对象是否可迭代:就看这个对象是否提供了迭代器,通过__iter__来获取迭代器
    所有的容器类型(包括字符串)都是可迭代的 文件也是可迭代对象

    迭代器的使用
    1.通过调用对象的.__iter__()方法得到迭代器
    2.调用迭代器的__next__()来获取每一个只
    li = [1,2,3,4,5]
    res = li.__iter__()
    print(res)
    
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())
    #打印结果为
          1
          2
          3
          4
          5
    li = [1, 3, 2, 5, 6]
    
    print(li.__iter__().__next__())
    print(li.__iter__().__next__())
    print(li.__iter__().__next__())
    print(li.__iter__().__next__())
    print(li.__iter__().__next__())
    #此时结果为:
                        1
                        1
                        1
                        1
                        1
    以上两种结果的不同是因为第一种方式将res = li.__iter__ 通过取到得迭代器赋给res将其存储在内存的某个空间
    ,在以后调用时就不会再重新取迭代器
    而 方式二恰恰想法,每次运行print都会重新取迭代器,因此结果全为1


    如何判断一个对象是不是迭代器
    迭代是为了取值,取值使用next方法,那么只要对象有next方法,就叫迭代器
    其中文件比较特殊,它既是迭代器,又是可迭代对象

    迭代器总结:
    迭代器是一种通用的取值工具
    只有具有__iter__方法的对象才能被迭代器取值,称之为可迭代对象
    迭代器是为了取值,只要具备next方法就是迭代器
    python中迭代器同时具备iter方法和next方法,调用iter返回迭代器自身
    每种数据类型的迭代实现各不相同

    为神魔用迭代器?
    统一取值方式
    如何使用?
    使用迭代器就算是使用for循环
    msg = {1,2,3,4,5}
    
    res = msg.__iter__()
    while True:
        try:
            print(res.__next__())
        except:
            print("停止迭代啦.... 没有值了")
            break
    print("over")
     for i in msg: # i = msg.__iter__().__next__()
    print(i)
    生成器generator
    名词解释
    生成数据的工具
    生成是从无到有的过程
    工具可以直接看成函数,我们可以自己定义一个函数来产生数据,但是每次执行都只能产生一个
    生成器的目的就是可以多次不断的产生数据

    在python中生成器就是一个函数
    但函数内部具备至少一个yield
    反过来只要函数中出现了yield那么该函数就是生成器
    def my_generator():
        print("start")
        yield 1
        print("over")
        yield 2
    
    gen = my_generator()
    print(gen)
    
    res1 = gen.__next__()
    print(res1)
    res2 = gen.__next__()
    print(res2)


    yield关键字
    一旦函数中出现了yield,调用函数时就不会立即执行函数,会返回一个生成器对象
    当调用生成器的next方法时会执行函数体,但是如果执行期间遇到了yield,函数就会暂停
    每次调用next都是继续上一次yield的位置继续往下执行,同时会将yield后的数据返回给调用者

    yield与return的区别:
    都能返回一个值
    不同之处在于 return只返回一次值,只要执行return函数就整体结束
    尔yield可以返回多次值,并且会在返回后将函数停住
    生成器就是迭代器
    生成器同时具备iter和next函数,足以证明其就是一个迭代器,,所以可以直接用for遍历
    迭代器就是通过生成器实现的

    迭代器/生成器/for的关系
    for的原理是使用迭代器取值
    迭代器是通过生成器实现的

    了解知识点
    yield的特殊用法
    当你的生成器中是需要外界数据参与是,生成器如何接收外界数据?
    闭包和参数都能传数据到生成器中,但是都只能接收一次值,如果想要多次传值,就需要send
    send函数用于向生成器发送数据,但是要注意必须先进行初始化,也就是调用一次__next__()
    
    
    # send的使用
    # def eat(name):
    #     print("this is a chicken name is",name)
    #     while True:
    #         food = yield "鸡蛋"
    #         print("收到的数据",food)
    #
    # c = eat("bgon")
    #
    #
    # c.__next__() #初始化生成器
    # c.send("饲料") #fasng shu
    # c.send("虫子")
    面向过程编程
    是一种编程思想,在编程界不止这一种编程思想,还有面向对象等等,
    编程思想没有高低之分,只有适合不适合
    你要思考的是什么样的应用程序适合哪种思想
    核心在于过程,指的是在编程时时刻想着过程
    过程指的就是,第一步干甚,第二步干什么,完成这个任务需要哪些步骤以及每个步骤要干什么

    面向过程编程思想的优点与缺点
    优点:可以将一个复杂的大问题,拆分为简单的小问题 将复杂的问题简单化,流程化
    缺点:牵一发动全身,扩展性极差,正因如此,才有了新的编程思想即面向对象
    使用场景:对于一些扩展性要求不高的应用程序,建议采用面向过程,例如系统内核,shell脚本程序
    后期我们开发的应用程序大多是直接面向用户的,需求变化频繁,这时需要使用面向对象




  • 相关阅读:
    分布式事务slides
    为什么jdk中把String类设计成final
    Struts 体系结构与工作原理 图
    在指定路径或者是文件名查找指定的字符串
    Apache Avro 与 Thrift 比较
    SSL请求trustStore的两种注册方式
    java中的split使用的是正则表达式
    所有ghost操作系统大全
    Tomcat帮助文档翻译 未完成
    ORACLE基本配置
  • 原文地址:https://www.cnblogs.com/Hale-wang/p/10277518.html
Copyright © 2011-2022 走看看