一.什么玩意是迭代器?

先说说什么是迭代吧,迭代就是一件事情重复很多次,比如说for循环。

for循环可以对一切有iter方法的对象进行迭代,那么什么是iter方法呢?

一个对象是否可迭代,全都取决于这个对象是否有iter方法,调用对象的iter方法,就回返回一个迭代器,这个迭代器一定具有next方法,在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代。

迭代器还有个很重要的特性,就是不可逆,只能前进,不能后退。

for循环就是这样工作的,for循环在循环一个对象的时候,会调用这个对象的iter方法,得到迭代器,然后在调用这个迭代器的next方法,去获得这个迭代器中包涵的每个值。

二.列表和迭代器的区别在哪里?如何可以实现一个基本的迭代器?

迭代器的工作方式,是在使用的时候计算一个值获取一个值,而列表呢,是一次性获取所有的值,如果有很多值,就会占用很大的内存。

当自己创建一个对象时,如何让自己的对象可迭代?

class test_class:

def init(self,start_num,stop_num):

self.start_num = start_num

self.stop_num = stop_num

def next(self):

if self.start_num < self.stop_num:

self.start_num += 1

return self.start_num

def iter(self):

return self

test_obj = test_class(0,3)

print test_obj.next()

>>>1

print test_obj.next()

>>>2

print test_obj.next()

>>>3

三.什么是生成器?

个人的理解,生成器是个比较特殊的可迭代对象,它与其他的可迭代对象不太一样的地方,就是,其他的可迭代对象需要调用iter方法,返回个迭代器对象,然后通过迭代器对象去执行next方法,获取迭代器中的值,但是生成器直接可以被迭代,无需执行iter方法。

在python中生成器有两种表达形式:

函数式生成器:也就是字面意思,在常规的函数中定义的生成器,语句的返回值不再使用return去返回,而是使用yield关键字每次返回一个结果,一个函数中不可以有多个return,但是可以有多个yield,函数中的每一个yield都会返回一个结果,每执行一个yield,函数的执行状态都会被‘挂起’可以理解为暂停,下次继续调用这个函数的时候,会从上次挂起的位置继续向下执行。

下面是关于函数式生成器的例子:

下面这个例子验证了yield的两种特性,第一种是一个函数可以yield多个值,有多个yield,另外一个就是函数式生成器的挂起特性。

def func1():

yield 1

print "第一个yield执行完成~"

yield 2

print "第二个yield执行完成~"

yield 3

print "第三个yield执行完成~"

for i in func1():

print i

>>>1

第一个yield执行完成~

2

第二个yield执行完成~

3

第三个yield执行完成~

生成器表达式:使用类似于列表推导式的方法,但是返回的对象不再是一个列表,而是一个可以按需生成结果的一个对象(生成器)。

例1:

for i in (i for i in range(10000)):

print i

(i for i in range(5)) 这个就是生成器表达式。

(i for i in range(10000)) = def test(): for i in range(10000):yield i

这两个种写法起到的作用是一样的,只不过是写法不同,一个是生成器表达式,另一种是函数式生成器。

有没有觉得这种生成器表达式和列表推导式看起来很像,不同的地方就在于列表推导式是使用[]中括号,而生成器表达式使用的是()小括号?

事实就是如此,它们之间的语法确实只差一个括号,但是,生成器表达式更节省内存空间。

关于生成器,大致就说的差不多了,最后来个总结:

生成器的定义方法与普通的函数是一模一样的,不同的地方就是生成器使用yield返回一个值,函数使用return返回一个值。

在python中,生成器会自动实现迭代协议,在没有值可以返回的时候,返回一个StopIteration异常。

生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。

下面的例子是列表推导式和生成器表达式执行的效率对比,感兴趣的小伙伴可以在自己电脑上执行一下试试。

#列表解析

sum([i for i in range(100000000)])#内存占用大,机器容易卡死

#生成器表达式

sum(i for i in range(100000000))#几乎不占内存

python迭代器和生成器的作用_python迭代器与生成器的详细介绍相关推荐

  1. python中bool函数的作用_Python内置bool函数详细介绍

    英文文档: classbool([x]) Return a Boolean value, i.e. one of True or False. x is converted using the sta ...

  2. python简述文件的操作步骤_Python文件读取操作的详细介绍

    本篇文章给大家带来的内容是关于Python文件读取操作的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 读取文件的操作步骤 有一道脑筋急转弯,问把大象装进冰箱的步骤,答案很简 ...

  3. int是python的内置函数吗_Python内置int函数详细介绍

    英文文档: class int(x=0) class int(x, base=10) Return an integer object constructed from a number or str ...

  4. python迭代器两个基本方法_python迭代器如何实现

    迭代是Python最强大的功能之一,是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有 ...

  5. python中匿名函数的作用_Python 中的匿名函数,你会用吗

    原标题:Python 中的匿名函数,你会用吗 概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则 ...

  6. python中yield语句的作用_Python中关键字yield有什么作用

    python中,yield关键字的作用:1.将一个函数修改为生成器,利用生成器可以有效地节约系统资源,避免不必要的内存占用:2.用于定义上下文管理器:3.协程:4.配合from形成yield from ...

  7. python函数对变量的作用_python函数对变量的作用及遵循的原则

    1.全局变量和局部变量 全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在 例如: 1 n=1 #n是 ...

  8. python max函数_Python max内置函数详细介绍

    Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest ite ...

  9. python如何使用多线程_python多线程应用中的详细介绍

    python多线程在应用的时候有不少的事情需要重点的注意.其实只要掌握这些相关的技术段就能保证这个应用的完整.下面我们来看看具体是需要如何进行操作. 今天看了近一天关于多线程的应用中,如何安全调用py ...

最新文章

  1. 管理表空间和数据文件——维护表空间——改变表空间的读写状态和改变表空间名称...
  2. python对财务人员的帮助-帮公司财务妹子写了个“群发工资条”的Python脚本!
  3. java -XX:+PrintFlagsInitial该命令可以查看所有JVM参数启动的初始值
  4. Windows 10下,如何使用PowerShell批量重启局域网电脑
  5. 【Hook】postman工具的代码生成工具让它锦上添花
  6. Pytorch 张量tensor
  7. 炫彩渐变海报素材模板,可运用到海报、电商设计等方面
  8. Java操作word文件的工具选择
  9. linux返回值含义,linux命令返回值的含义解析
  10. 历年蓝桥杯日期类问题总结
  11. 2022-渗透测试-口令破解-几款暴力破解和字典生成的工具
  12. 3dmax快捷键命令大全
  13. 韩立刚《计算机网络》| 第7章 网络安全
  14. Android 分贝测试仪功能,华为移动终端开发
  15. [2] UI原型设计工具Pencil Project 学习系列----- 入门
  16. Unity(数据库SQLite)
  17. 2020 Stibo Systems全球事业部新财年启动大会胜利召开
  18. 升级扩散模型!一步成图,1秒18张,OpenAI开源
  19. 关于安装cmd命令行安装pyinstaller库失败的解决方法
  20. 想问一下杭州恒生电子证券事业部如何

热门文章

  1. X001---初识alteryx
  2. 【数字信号去噪】基于matlab稀疏性BEADS色谱基线估计和去噪【含Matlab源码 1887期】
  3. 命令提示符cmd的替代方案
  4. [前端踩坑]引入组件报错Already included file name ‘XXX‘ differs from file name ‘XXX‘ only in casing.
  5. 番茄插件遇到的各种安装问题处理
  6. Idea-06:Amoeba management(阿米巴经营)
  7. 配置AutoFac(IOC容器)
  8. 利用R语言获取最新所有股票数据
  9. Java编程 等差数列
  10. 实现单点登录SAP PO JAVA客户端(ESR/ID),无需每次下载