day13,day14

2022-11-10,

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

day13,day14的相关教程结束。

《day13,day14.doc》

下载本文的Word格式文档,以方便收藏与打印。