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脚本程序
    后期我们开发的应用程序大多是直接面向用户的,需求变化频繁,这时需要使用面向对象




  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/Hale-wang/p/10277518.html
Copyright © 2011-2022 走看看