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

    一:迭代的概念

    迭代器即迭代的工具,那么迭代是什么概念呢?

      迭代是一个重复的过程,每重复一次即迭代,并且每一次迭代的结果都是下一次的初始值

    简易的迭代器

    l =["a","b","c","d"]
    i = 0
    while i < len(l):
        print(l[i])
        i +=1

    为什么要有迭代器?

    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。

    什么是可迭代对象?

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下3、什么是迭代器对象?可迭代对象执行obj.__iter__()得到的结果就是迭代器对象。

    迭代器对象是什么?

    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。

    文件类型是迭代器对象:

    open('a.txt').__iter__()
    open('a.txt').__next__()

    注意:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

    迭代器对象:迭代器运作的对象

    dic = {"x":1,"y":2,"z":3}
    iter_dic = dic.__iter__()#字典的迭代器对象
    print(iter_dic.__next__())#迭代器对象使用内置方法迭代取值
    print(iter_dic.__next__())
    print(iter_dic.__next__())

    二:for循环原理分析

    for循环称之为迭代器循环,in后跟的必须是可迭代对象:
      for循环会执行in后的对象的__iter__方法,拿到迭代器对象;
      然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体;
      周而复始,直到取值完毕,for循环会监测到异常,自动结束循环。

    三:迭代器的优缺点

    迭代器的优点:

      提供了一种可以不依赖于索引取值的方式。

      迭代器每次只取一个值,__next__方法调用一次去一个,省内存。
    缺点:
      取值麻烦一次只能取一个值;
      只能往后取,并且是一次性的;
      无法用len获取长度。

    四:生成器

    什么是生成器?

    只要函数体带有yield关键字的函数就是生成器

    调用带有yield关键字的函数,返回的结果就是生成器,且不会执行函数代码:

    def foo():
        print("sdsadas")
        yield 1  # 出产,产生
        print("sdsadas")
        yield 2
        print("sdsadas")
        yield 3
        print("sdsadas")
        yield 3
        
    res = foo()

    生成器与迭代器

    当我们获得生成器函数调用的返回值后,赋值拿到,可以看到其内置有__iter__方法和__iter__方法,根据迭代器的定义,可以知道生成器就是迭代器。

    因此可以使按照迭代器的使用方法来使用:

    res.__next__()          #执行生成器,执行到yield结束,yield返回的值
    print(res.__next__())   #执行生成器,并把yiled返回结果打印
    next(res)               #和res.__next__()执行结果一致

    yield总结

      把函数做成迭代器

      对比return,可以返回多次值,可以挂起/保存函数的运行状态

    五:面向过程编程

    强调:面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序。

    定义:面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。

    优点:复杂的问题流程化,进而简单化

    缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身

    应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd。

    面向过程编程实践:

      流水线1:用户输入用户名、密码--->用户验证--->欢迎界面

      流水线2:用户输入sql--->sql解析--->执行功能

  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/li1992/p/8681357.html
Copyright © 2011-2022 走看看