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. Tronado自定义Session

    这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括: 下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用req ...

  2. Chrome Extension 实战

    想起个问题,线上项目js要有bug,怎么进行调试修改. ------------- 想起来,方法应该是,拦截线上的js的请求,转到本地代码上进行调试... ------------- 网上看到 Chr ...

  3. 结束autocad异常进程

    近日在做CAD自动化数据处理,程序在服务器上运行,运行时间长了会发生异常“autocad application 已停止工作”,这个时候需要通过守护程序去重启CAD, 通过CMD命令“@taskkil ...

  4. ActiveReports 报表控件V12新特性 -- 新增矩表的RepeatToFill属性

    ActiveReports是一款专注于 .NET 平台的报表控件,全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求 ...

  5. 在ASP.NET MVC 中使用ActiveReports报表控件

    随着MVC模式的广泛运用,对Web应用系统的开发带来了巨大的影响,我们好像又回到了原来的ASP时代,视乎这是一种后退而不是一种进步,不过MVC模式给我们带来的影响不仅限于我们所看到的这一点..MVC看 ...

  6. Expo大作战(二十)--expo中的Release channels(不重要*)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  7. linux查看某IP尝试连接成功和失败次数

    查看连接失败次数 cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2" ...

  8. Problem1-Project Euler

    Problem1-Project Euler Multiples of 3 and 5   If we list all the natural numbers below 10 that are m ...

  9. LeetCode题解之 Implement strStr()

    1.题目描述 2.题目分析 字符串操作,注意边界条件即可. 3.代码 int strStr(string haystack, string needle) { int n = needle.size( ...

  10. Jmeter中自动重定向与跟随重定向的区别

    一.重定向就是通过各种方法将各种网络请求重新定个方向转到其它位置. 二.我们在网站建设中,时常会遇到需要网页重定向的情况: 1.网站调整(如改变网页目录结构): 2.网页被移到一个新地址: 3.网页扩 ...