python成长之路12——生成器和迭代器

一. 什么是生成器和迭代器

   使用一个可迭代的对象比一个列表的好处:

还记得前面的filter和map吗,他们的返回值是一个相应的对象,我们可以循环这个对象,就取到了每个对象元素,而且取完之后,这个元素就没啦,一边取值,一边垃圾回收,这样相对于返回值直接是一个列表,就大大的节省了内存。因为如果返回值是一个长度几万几十万的列表,会一下子在内存里开辟那么多的内存空间,但是如果生成的是一个filter或者map对象,就没有这个担心啦。

  我们用一个小例子来进行对比:

 1 #要用python2.7的环境
 2 #py3中range和xrange合并啦,不再有xrange,range的返回值是range对象,不再是list
 3
 4 ret=range(0,10)
 5 print ret
 6 print type(ret)
 7
 8 ret=xrange(0,10)
 9 print ret
10 print type(ret)
11
12 执行结果:
13 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
14 <type ‘list‘>
15 xrange(10)
16 <type ‘xrange‘>
17
18 #可以明显看出生成一个可迭代的对象要比生成一个list对内存的占用少的多,xrange的话,取完一个值,用完之后,就会垃圾回收。

range和xrange

生成器就可以实现这个功能。那么什么是生成器呢?

生成器是一次生成一个值的特殊类型函数。标志性的单词就是yield。

  迭代器就是利用next来从生成器里取数据。

 1 def f1():
 2     print("生成第一个数")
 3     yield 1
 4     print("生成第二个数")
 5     yield 2
 6     print("生成第三个数")
 7     yield 3
 8 ret=f1()
 9 #执行f1()的时候,3个print都没有输出,生成器是一种特殊的函数
10 print(ret)
11 #生成器生成的ret是一个生成器对象,这个对象可以迭代
12 print("*"*10)
13 print(list(ret))
14 print(list(ret))
15
16 执行结果:
17 <generator object f1 at 0x102189c50>
18 **********
19 生成第一个数
20 生成第二个数
21 生成第三个数
22 [1, 2, 3]
23 []
24
25 def f1():
26     print("生成第一个数")
27     yield 1
28     print("生成第二个数")
29     yield 2
30     print("生成第三个数")
31     yield 3
32 ret=f1()
33 #生成器可以配合__next__使用
34 r1=ret.__next__()
35 print(r1)
36 #r1:ret.__next__() 会找到函数中的第一个yield,执行函数到这个yield为止,并将yield后面的数据返回
37 r2=ret.__next__()
38 print(r2)
39 #r2:ret.__next__() 会执行上一个yield下面的代码直到遇到下一个yield,同上会返回yield后面的数据
40
41 执行结果:
42 生成第一个数
43 1
44 生成第二个数
45 2

yield

注意:实际使用的时候是不需要我们一个一个的_next_的,for循环帮我们做了next,也可以说for循环封装了迭代器。

二. 生成器小例子

 1 def zyrange(m,n):
 2     while True:
 3         yield m
 4         m+=1
 5         if m == n:
 6             break
 7
 8 for i in zyrange(4,10):
 9     print(i)
10
11 执行结果:
12 4
13 5
14 6
15 7
16 8
17 9

使用生成器实现range的功能

时间: 2024-10-19 06:42:13

python成长之路12——生成器和迭代器的相关文章

Python学习之路 - yield生成器,迭代器

生成器 把结果保存成生成器的状态,普通的函数中出现yield,就变成生成器. 1.Python 3.3 中 xrange已合并到range. 1 i = range(10) 2 print (i) 3 4 =>range(0, 10) 2. yield 生成器. 1 def func(): 2 print(111) 3 yield 1 4 print(222) 5 yield 2 6 print(333) 7 yield 3 8 return "done" 9 10 k = fu

Python之路-python(装饰器、生成器、迭代器、Json &amp; pickle 数据序列化、软件目录结构规范)

装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不能修改被装饰的函数的调用方式. 1 def test(): 2 print('test') 3 print(test ) #表示是函数 4 test() #表示执行foo函数 <function test at 0x00595660>#表示的是函数的内存地址test#函数test执行结果 简单的装

Python之路【第六篇】:Python基础(22)——生成器和迭代器

迭代器 迭 代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们 很少在迭代途中往后退.另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之 后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件. 特点: 访问者不需要关心迭代器内部的结构,仅需通过__next()__(Python2.x

我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算是有一点基础.但在这里我要保持空杯心态,一切从头开始.好了不多说,Let's Python!!!! 一.Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.目前Python已经成为实际上除了中国最流行的开发语

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

Python学习之旅—Day07(生成器与迭代器)

前言 本篇博客主要专注于解决函数中的一个重要知识点--生成器与迭代器.不管是面试还是工作,生成器与迭代器在实际工作中的运用可以说是非常多,从我们第一天开始学习for循环来遍历字典,列表等数据类型时,我们就已经和生成器,迭代器打交道了!本篇博客从最基础的基本概念,例如容器,可迭代对象,生成器,迭代器的概念,到for循环是怎么工作的娓娓道来.希望本篇博客能够帮助大家切实掌握生成器与迭代器的使用与底层原理. 一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in

python(七)字符串格式化、生成器与迭代器

字符串格式化 Python的字符串格式化有两种方式:百分号方式.format方式 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name)      可选,用于选择指定的key flags          可选,可供选择的值有: +       右对齐:正数前加正好,负数前加负号: -        左对齐:正数前无符号,负数前加负号: 空格    右对齐:正数前加空格,负数前加负号: 0        右对齐:正数前无符号,负数前

Python成长之路【第五篇】:Python基础之迭代器和生成器

一.递归和迭代 递归就是调用自身 迭代就是每次迭代都是依赖于上次结果 二.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for循环,sum,min,max等函数)都是使用迭代器协议访问对象 三

python之路系列-生成器和迭代器-景丽洋老师

返回顶部 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的. 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置. 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值. 但你有没有想过,我们为什么可以