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. java.lang.IllegalArgumentException: findUserById is ambiguous in Mapped Statements collection

    这是由于mybatis的mapper  xml文件中的id 名字和mybatis内置的方法可能有冲突导致的,  更改xml 的id  名字就可以了!

  2. js 从URL上获取参数

    //获取匹配的        function getUrlParam(name) {             var reg = new RegExp("(^|&)" + ...

  3. css3 content 特殊字符和符号

    基本形状 ▲ 9650 25B2 ► 9658 25BA ► 9658 25BA ▼ 9660 25BC◄ 9668 25C4 ❤ 10084 2764 ✈ 9992 2708 ★ 9733 2605 ...

  4. html页面跳转传递参数

    效果如下: a页面 点击跳转按钮后 在b页面可以获取到对应的值. 代码如下: a页面: <!DOCTYPE html> <html> <head lang="e ...

  5. js 匿名函数立即执行问题

    js立即执行函数写法理解 这篇真的写得很清楚了,不光括号可以将函数声明转换成函数表达式然后立即执行,!,+,-,=也都可以转换,但是可能会带来意外的结果,因此一般都用括号实现. 还有关于for (va ...

  6. win7下解决vs2015新建项目,提示“未将对象引用设置到引用实例“的问题

    问题描述: 打开vs2015新建c++项目时,出现有如下内容的对话框“未将对象引用设置到引用实例”的提示 解决方法: 1.  温馨提示:千万不要一冲动,就去卸载vs2015!! win7下安装vs20 ...

  7. 【疑难杂症04】EOFException异常详解

    最近线上的系统被检测出有错误日志,领导让我检查下问题,我就顺便了解了下这个异常. 了解一个类,当然是先去看他的API,EOFException的API如下: 通过这个API,我们可以得出以下信息: 这 ...

  8. Android IOC注解库EasyUI

    EasyUI介绍 1.使用反射机制和注解实现类似于butterknife的IOC框架 2.快速的findViewById和OnClick 3.扩展了click时无网络监测 4.扩展了快速点击监测 使用 ...

  9. AOP编程报错Xlint:invalidAbsoluteTypeName

    @Component@Aspectpublic class DingdingAspect { private Logger logger = LoggerFactory.getLogger(this. ...

  10. 为什么Sql Server的查询有时候第一次执行很慢,第二次,第三次执行就变快了

    老外提问: Hi, I have an sql query which takes 8 seconds in the first run. The next run there after takes ...