zoukankan      html  css  js  c++  java
  • day13,day14

    day13

    迭代器

    什么是迭代器?

      迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而进行的

      器:迭代取值的工具

    为何要用迭代器?

      迭代器提供了一种通用的不依赖于索引的迭代取值方式

    如何用迭代器?

      可迭代对象iterablie,但凡内置有__iter__方法的对象都称之为可迭代对象(str,list,tuple,dict,set,文件对象)

      执行可迭代对象下的__iter__方法,返回的值就是一个迭代器对象。迭代器对象内置有__next__方法。

    迭代器对象:

      既内置有__next__方法的对象,又内置有__iter__方法的对象

      注:

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

      2、文件本身是一个迭代器对象

    迭代器:

      优:1、不依赖于索引的迭代取值方式

        2、同一时刻在内存中只存在一个值,更节省内存

      缺:1、取值不如按照索引和key的方式灵活(不能取指定的某一个值,而且只能往后取)

        2、无法预测迭代器长度

    day14

      生成器:

        一种自定义的迭代器

      yield:

        但凡函数内包含yield关键字,再去调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象。

        def func():

          print('hello world')

          yield  #带有yield关键字的函数,这个关键字会暂停函数体代码,同时yield也具有return的效果能有一个返回值,只是他返回的是一个生成器对象

        g = func()  #此时函数体代码并不会运行,但是将变量g变成了一个生成器

        next(g)  #调用这个生成器g的next内置方法,会将生成器内的代码(也就是函数体代码)运行一次

      

      #############################

      def add(start,stop,step=1)

        while start < stop:

          yield start

          start+=step

      

      for i in add(1,10):

        print(i)

      这就是一个简单的range方法的实现

      ##############################

      def dog(name)

        print('%s,准备开吃'%name)

        food = yield

        print('%s吃了%s'%(name,food))

      g = dog('sql')

      next(g)

      g.send('肉包子')  

      这是一个先把函数体代码暂停,再往函数体代码中传值的方式

      #################################

    生成器表达式:

      [i**3  for i in range(1,10)  if i > 5]

      (i**3  for i in range(1,10)  if i > 5)

      这两行代码看起来很相似,但是第一行是我们之前所提到过的列表生成式,而第二行就是标题要说的生成器表达式,就是用()括起来的一系列表达式就是为生成器表达式

      ##################################

      def len_file(address):

        with open(r'%s'%address,mode = 'rt',encoding = 'utf-8') as f:

          s = (len(i) for i in f)

          print(sum(s))

      这就一个将生成器表达式运用于来统计文件字符多少的例子,将生成器表达式和内置方法结合使用。

      #####################################

    面试题:

     ##################################

    def add(n,i):
    return n+i

    def test():
    for i in range(4):
    yield i

    g=test()  #这g是一个是一个生成器
    for n in [1,10]:
    g=(add(n,i) for i in g)  #(add(n,i) for i in g)这是一个生成器表达式
    res=list(g)
    #A. res=[10,11,12,13]
    #B. res=[11,12,13,14]
    #C. res=[20,21,22,23]
    #D. res=[21,22,23,24]
    第一次循环
      n=1
      g=(add(n,i) for i in g)
    代码并没有执行
    第二次循环:
      此时(add(n,i) for i in g)中的g等于(add(n,i) for i in g)
      所以第二次循环的g = (add(n,i) for i in g)这条代码其实真正的样子应该是  g=(add(n,i) for i in (add(n,i) for i in g))
      再来分析
      此时n=10 而且 list(g)使第二次循环代码可以运行
      所以 将n带入(add(n,i) for i in g)这一条代码中
      得出 10 再带入前面的代码 得出 n+10
    所以正确答案为 C

    ######################################
    面向过程编程
      核心是过程二字,过程就是解决问题的步骤。
      基于该思想编写的程序就好比在设计一条流水线,是一种机械式的思维方式。
      优点:复杂的问题流程化,进而简单化
      缺点:扩展性极差。

  • 相关阅读:
    clone对象
    Windows下swoole扩展的编译安装部署
    PHP备忘录
    Linux文档的压缩与打包
    Linux系统启动过程
    Linux虚拟机安装
    MongoDB自动增长
    MongoDB固定集合(Capped Collections)
    Activating Google Cloud Storage
    Downloading the Google Cloud Storage Client Library
  • 原文地址:https://www.cnblogs.com/yaoxiaofeng/p/9430498.html
Copyright © 2011-2022 走看看