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的更多相关文章

  1. asp.net 操作Excel大全

    asp.net 操作Excel大全 转:http://www.cnblogs.com/zhangchenliang/archive/2011/07/21/2112430.html 我们在做excel资 ...

  2. 报错:对象必须实现 IConvertible;以分隔符进行分割链接concat_ws的使用方法;mysql数据类型转换cast,convert

    错误故障,mysql  服务器上用 concat_ws 函数,连接了一串数字,最后 服务器返回的字段就变成了一个 byte ,而我们想要的类型是  string 类型,那么转换的时候,就报错了. 正确 ...

  3. Go开发之路(目录)

    知识点 1. Go语言 简介 2. Go语言 基本语法 3. Go语言 strings以及strconv的使用 4. Go语言 时间和日期类型 5. Go语言 指针类型 6. Go语言 流程控制 7. ...

  4. C#操作excel(多种方法比较)

    1.用查询表的方式查询并show在数据集控件上. public static string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; D ...

  5. Django 多个字段关联同一外键

    # -*- coding: utf-8 -*- """ Tencent is pleased to support the open source community b ...

  6. os模块补充以及序列化模块

    os模块补充以及序列化模块   一.os模块的补充 1.os.path.abspath 能把存在的相对路径的绝对路径显示出来 path = os.path.abspath("连达day19. ...

  7. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

  8. 【JAVA零基础入门系列】Day14 Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  9. python_way day14 CSS

    python_way day14 CSS 层叠样式表 一.CSS作用域: 二.css标签选择器 三.css样式 一.css作用域: 基本用法:style="样式" <body ...

随机推荐

  1. python协程的简单了解

    协程: 协程,又称微线程,纤程.英文名Coroutine. 可以在不同的函数间切换,而且切换的次数和时间都是由用户自己确定的. 协程的几种实现方式: (1)使用生成器yield实现. 如果不了解生成器 ...

  2. Javascript 随机数函数 学习之一:产生服从均匀分布随机数

    大家都知道Math.random是 javascript 中返回伪随机数的函数,但查看 MDN, The Math.random() function returns a floating-point ...

  3. 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项

    如下图所示,如果需要使用ArcGIS Runtime 100 进行本地GIS数据处理,则需要依赖Local Server通过发布GP服务实现. 一.ArcGIS Runtime所使用的GPK是有版本限 ...

  4. 自定义适用于手机和平板电脑的 Dynamics 365(二):窗体自定义项

    适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365 使用窗体作为 Web 应用. 窗体在应用程序中的显示方式为移动体验进行了优化. 下图显示了从 Web 应用程序到 ...

  5. 活字格Web应用平台学习笔记 7 - 导出 Excel

    活字格一直强调和Excel的兼容,可以导入导出Excel,今天终于学到这一课了. 课程目标: 好吧,就是这么快,已经加了一个“导出到Excel”的按钮了 我以为多高深呢,原来人家都给写好逻辑了,直接选 ...

  6. Python+Selenium笔记(十四)鼠标与键盘事件

     (一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的Ac ...

  7. CSS3动画详解(图文教程)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 本文主要内容: 过渡:transition 2D 转换 trans ...

  8. windows7下搭建python环境并用pip安装networkx

    1.安装顺序:Python+pip+pywin32+numpy+matplotlib+networkx 2.版本问题 所安装的所有程序和包都需要具有统一的python版本.系统版本和位宽,所以第一步要 ...

  9. EntityFramework 贪婪加载与延迟加载以及资源回收

    EntityFramework的资源回收 1) Using 内包含Entity的上下文关系,对俩表做Add操作,最好可以直接写一个 entity.SaveChanges(); 完成两张表的同时add操 ...

  10. python基础学习18----面向对象简述

    这里就不再讲面向对象的相关概念知识或者与面向过程的比较了,直接进入类的学习 1.类的创建 class people: def __init__(self):#构造函数 pass sfencs=peop ...