一、生成器( iter )

从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。

它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。

1、对比 range 和 xrange 的区别

  1. >>> print range(10)
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  3. >>> print xrange(10)
  4. xrange(10)

  如上代码所示,range会在内存中创建所有指定的数字而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。

  1. def nrange(num):
  2. temp = -1
  3. while True:
  4. temp = temp + 1
  5. if temp >= num:
  6. return
  7. else:
  8. yield temp

自定义迭代数字生成器

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3.  
  4. def xrange():
  5. print(11)
  6. yield 1
  7.  
  8. print(22)
  9. yield 2
  10.  
  11. print(33)
  12. yield 3
  13.  
  14. # 仅仅获取到了一个生成器 #含有yield的函数叫做生成器函数
  15. r = xrange() #这是一个生成器
  16.  
  17. #生成器的__next__方法
  18.  
  19. ret = r.__next__()
  20. print(ret)
  21. ret = r.__next__()
  22. print(ret)
  23. ret = r.__next__()
  24. print(ret)

课上实验代买 生成器

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3.  
  4. def n2(start,stop):
  5. start = start
  6. while stop:
  7. yield start
  8. start +=1
  9. def xrange2(start,stop):
  10. obj = n2(start,stop)
  11. for i in range(start,stop):
  12. j = obj.__next__()
  13. print(j)
  14. def n1(stop):
  15. start = 0
  16. while stop:
  17. yield start
  18. start +=1
  19. def xrange1(stop):
  20. obj = n1(stop)
  21. for i in range(stop):
  22. j = obj.__next__()
  23. print(j)
  24.  
  25. def xrange(*args):
  26. if len(args) == 1:
  27. xrange1(*args)
  28. elif len(args) == 2:
  29. xrange2(*args)
  30. else:
  31. print("参数不对 1 or 2")
  32.  
  33. if __name__ == "__main__":
  34. xrange(2,11)

课上练习

2、文件操作的 read 和 xreadlinex 的的区别

  1. read会读取所有内容到内存
  2. xreadlines则只有在循环迭代时才获取
  1. def NReadlines():
  2. with open('log','r') as f:
  3. while True:
  4. line = f.next()
  5. if line:
  6. yield line
  7. else:
  8. return
  9.  
  10. for i in NReadlines():
  11. print i

基于next自定义生成器NReadlines

  1. def NReadlines():
  2. with open('log','r') as f:
  3. seek = 0
  4. while True:
  5. f.seek(seek)
  6. data = f.readline()
  7. if data:
  8. seek = f.tell()
  9. yield data
  10. else:
  11. return
  12.  
  13. for item in NReadlines():
  14. print item

基于seek和tell自定义生成器NReadlines

二、迭代器  iterators

迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身

迭代器可使用内建的iter方法创建,见例子:

  1. >>> i = iter('abc')
  2. >>> i.next()
  3. 'a'
  4. >>> i.next()
  5. 'b'
  6. >>> i.next()
  7. 'c'
  8. >>> i.next()
  9. Traceback (most recent call last):
  10. File "<string>", line 1, in <string>
  11. StopIteration: 

  

Python全栈之路8--迭代器(iter)和生成器(yield)的更多相关文章

  1. Python全栈之路目录结构

    基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...

  2. Python全栈之路----目录

    Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...

  3. python 全栈之路

    目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...

  4. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  5. Python全栈之路4--内置函数--文件操作

    上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对 ...

  6. Python全栈之路----函数----返回值

    函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...

  7. Python全栈之路----函数进阶----迭代器

    我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list , tuple , dict , set ,str 等: 一类是 generator ,包括生成器和 ...

  8. Python全栈之路---运算符与基本的数据结构

    运算符 一.算术运算符: 练习: + 加法 两个对象相加 1 + 2得到3:'a' + 'b'得到'ab'. - 减法 一个数减去另一个数或者是负数 5 - 3得到2:-2得到一个负数 * 乘法 两个 ...

  9. Python全栈之路-Day32

    1 类的__slots__ #!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/4/25 # 只能定义__ ...

随机推荐

  1. go语言的print

    代码: package main import ( "fmt" ) type point struct { x, y int } func main() { //Go 为常规 Go ...

  2. ASP.NET Web API 学习【转】

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

  3. Document types require more than xhtml1.0

    这个东西只会在比较低版本的浏览器中会出现,比如IE7及以下会出这个错误. 错误的根源是html页面没有考虑浏览器兼容性问题. 在页面头部加入下面的内容即可解决标题中的问题 <!DOCTYPE h ...

  4. Django缓存使用方法

    Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...

  5. Android无法收到指定广播的问题总结

    首先是应用中不能只有一个广播,必须有一个activity或者service(这种情况比较复杂参考http://www.cnblogs.com/welcoming/p/4120497.html) 简单的 ...

  6. 深入理解 Laravel Eloquent(三)——模型间关系(关联)

    Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...

  7. SQL SERVER触发器游标小记

    今天接到个需求用触发器来实现通过条件对其他表的更新.好久没摸SQL SERVER,电脑里也没SQL SERVER安装包,同事遂发来个安装包,一看吓一跳,3.6G!!!!经过漫长等待后,开始作业.需求如 ...

  8. 关于listview的一些属性

    由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你 ...

  9. Linux 使用 su 切换用户提示 Authentication Failure 的解决方法

    Ubuntu v14.04,使用 su 命令切换用户时报验证失败的错误 这个问题产生的原因是由于 ubuntu 系统默认是没有激活 root 用户的,需要我们手工进行操作,在命令行界面下,或者在终端中 ...

  10. nodejs & nodemailer

    nodejs & nodemailer https://www.npmjs.com/package/nodemailer 上面的連接裏面 有有一個例子: 可以直接拿來用: 安裝依賴,在pack ...