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. apicloud 自定义模块引用aar

    apicloud 引入aar包,如果使用apicloud自定义模块的话,如果是一般的jar包,我们需要把jar down到本地然后添加到module的libs中就可以了(不要想着用远程地址了,既然用a ...

  2. 使用ThinkPHP实现生成/校验验证码功能

    首先了解父类Verity.class.php(ThinkPHP/Library/Think/Verity.class.php)中的一些函数 1:check() 校验验证码是否正确 2:entry()输 ...

  3. @Transactional事务不起作用原因

    想必也有人遇到@Transactional事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的@Transactional事务起作用而自己的事务却没有起作用.如下举例子说 ...

  4. 排错-windows下 ORA-12560 TNS 协议适配器错误解决方法

    排错-windows下_ORA-12560 TNS 协议适配器错误解决方法 by:授客 QQ:1033553122 问题描述: 修改SQL*Plus窗口属性后,重新打开SQL*Plus时出现ORA-1 ...

  5. 从零自学Java-4.使用字符串来交流

    1.使用字符串来存储文本: 2.在程序中显示字符串: 3.在字符串中包含特殊的字符: 4.拼接字符串: 5.在字符串中包含变量: 6.比较字符串: 7.判断字符串的长度: 程序Credits:显示一部 ...

  6. 反射式DLL注入--方法

    使用RWX权限打开目标进程,并为该DLL分配足够大的内存. 将DLL复制到分配的内存空间. 计算DLL中用于执行反射加载的导出的内存偏移量. 调用CreateRemoteThread(或类似的未公开的 ...

  7. sql Server 查询方法的优化

    在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法. 仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的.因此,我们得仔细考虑,如果 ...

  8. 使用 PowerShell 管理 Azure 磁盘

    Azure 虚拟机使用磁盘来存储 VM 操作系统.应用程序和数据. 创建 VM 时,请务必选择适用于所需工作负荷的磁盘大小和配置. 本教程介绍如何部署和管理 VM 磁盘. 学习内容: OS 磁盘和临时 ...

  9. tail 尾巴

    tail用法:尾巴,取文件的最后N行,默认前10行, -n 2 取前2行-n 2,简写就是-2 -f 文件 跟踪一个文件尾部的时时变化. 克隆出一个窗口执行:循环脚本:for n in `seq 1 ...

  10. [Spark RDD_add_1] groupByKey & reduceBykey 的区别

    [groupByKey & reduceBykey 的区别] 在都能实现相同功能的情况下优先使用 reduceBykey Combine 是为了减少网络负载 1. groupByKey 是没有 ...