博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 迭代器与生成器
阅读量:2455 次
发布时间:2019-05-10

本文共 1590 字,大约阅读时间需要 5 分钟。

一:迭代器

迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。

迭代器不能回退,只能从头到尾往前进行迭代。这并不是什么很大的缺点,因为人们几乎不需要在迭代途中进行回退操作。

迭代器也不是线程安全的,在多线程环境中对可变集合使用迭代器是一个危险的操作。但如果小心谨慎,或者干脆贯彻函数式思想坚持使用不可变的集合,那这也不是什么大问题。

对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值,这是后话)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

迭代器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。这个特点被称为延迟计算或惰性求值(Lazyevaluation)。

迭代器更大的功劳是提供了一个统一的访问集合的接口。只要是实现了__iter__()方法的对象,就可以使用迭代器进行访问。

另外,迭代器便于循环比较大的数据集合,节省内存。

使用内建函数iter()可以生成一个迭代器,

a = iter(range(3))print(a)print(a.__next__())print(a.__next__())print(a.__next__())### 输出结果
012

 

当元素访问完时,再调用next方法就会提示报错信息

Traceback (most recent call last):line 28, in 
print(a.__next__())StopIteration

Python正是根据是否检查到这个异常来决定是否停止迭代的。 

这种做法与迭代前手动检查是否越界相比各有优点。但Python的做法总有一些利用异常进行流程控制的嫌疑。

 

二:生成器generator

生成器是一个特定的“函数”,当调用时它返回一个生成器对象(所以你不能在定义生成器的时候 return 任何值,但可以使用单独的一个 return ,它代表进度结束)。生成器允许你返回一个值,然后暂停代码的执行,稍后恢复,可以这样重复 n 次。实现这一“优雅”效果的关键字就是 yield

简单来说,迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的。

简单的例子

def simple_generator_function():

    yield 1
   
yield 2
   
yield 3
for value in simple_generator_function():
   
print(value)
   
#### 输出结果
1
2
3

 

然后借用例子

import time

def consumer(name):
   
print("%s 准备吃包子啦!" %name)
   
while True:
      
baozi = yield
      
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
   
c = consumer('A')
    c2
= consumer('B')
    c.
__next__()
    c2.
__next__()
   
print("老子开始准备做包子啦!")
   
for i in range(10):
       
time.sleep(1)
       
print("做了2个包子!")
        c.send(i)
        c2.send(i)
producer(
"alex")

 

 

 

 

 

 

 

转载地址:http://aedhb.baihongyu.com/

你可能感兴趣的文章
django项目有那些包名_前5名:可穿戴设备,Django软件包,多样性,最佳文章
查看>>
#ansible:_前5名:Rasperry Pi项目,Ansible,勇敢使用新浏览器等
查看>>
gplv3_前5名:音乐制作人,法庭上的GPLv3,面向学生的Raspberry Pi等
查看>>
开源框架 admin_年度最佳5:年度开源项目,sys admin工具等
查看>>
libreoffice使用_前5名:LibreOffice功能,ownCloud使用,乐高项目等
查看>>
自己开发框架和用开源的框架_每个应用程序开发人员都应该知道的5大开源框架
查看>>
清华法学院横幅_法学院在开源法方面落后
查看>>
31岁学习编程还来得及吗_我已经是合子了。 对我来说学习编程是否为时已晚?
查看>>
vs2015软件系统开源_2015年最佳开源游戏
查看>>
opensource项目_Best of Opensource.com:年度最佳20篇文章
查看>>
开源crm排名_排名前6位的开源CRM工具
查看>>
十大开源项目_2015年十大开源项目
查看>>
raspberry ssh_使用Raspberry Pi SSH进入您的圣诞树
查看>>
光线跟踪 开源_要跟踪的前5个开源社区指标
查看>>
drupal_可持续Drupal:通过加快CMS节省能源的10种方法
查看>>
facebook开源项目_Facebook 2015年排名前5的开源项目
查看>>
vs2015已组织安装程序_2015年5大开放组织故事
查看>>
开启新事物_开始新的事物,因为它对您有好处
查看>>
贴纸样式 css3_前5名:开放贴纸,3种Google Maps API替代品以及更多
查看>>
linux图形仿真器_前5名:Linux终端仿真器,用于音频的Flac等
查看>>