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

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

迭代器:

可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

特点:

1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

2.不能随机访问集合中的某个值 ,只能从头到尾依次访问

3.访问到一半时不能往回退

4.便于循环比较大的数据集合,节省内存

 

生成器:

一个函数调用时返回一个迭代器,那这个函数就为生成器,如果函数中包含yield语法,那这个函数就变成生成器,生成器是一种特殊的迭代器。

特点:

1. 不会一次生成所有的结果,一次只返回一个结果

2. 不用准备好整个迭代过程中所有的元素,减少内存使用

3. 只能遍历一次

例子:

1. 通过for循环外面添加(),使其变成生成器

g = (x * x for x in range(10)) 通过next(g)来获取每一个值,获取最后一个元素之后,再调用会出现StopIteration的错误,可以通过捕捉来处理,更好的方法是使用for循环,因为generator也是可迭代对象,不需要关心StopIteration的错误。

2. 使用yield来实现斐波拉契数列

def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield a, b                   ## 生成器        a, b = b, a + b        n += 1    return "---done---"def main():    g = fib(6)    for i in g:        print(i[0],i[1])if __name__ == '__main__':    main()

3. 使用生成器实现协程并行效果

import timedef consumer(name):    print("%s 准备抢红包" % name)    while True:        money = yield        print("红包[%s]来了, 被[%s]抢到了" % (money, name))def producer(name):    c1 = consumer('A')    c2 = consumer('B')    c1.__next__()    c2.__next__()    print("开始准备发红包")    for i in range(10,15):        time.sleep(1)        print("发了一个红包,分两个")        c1.send(i)        c2.send(i)if __name__ == "__main__":    producer("wangzai")

 

转载于:https://www.cnblogs.com/654wangzai321/p/8150890.html

你可能感兴趣的文章
使用已有的私钥进行GitHub验证
查看>>
SQL中几个常用的排序函数
查看>>
exchange2010重要知识
查看>>
Linux之内核编译及LFS制作
查看>>
谢烟客---------Linux之Aho Weinberger Kernighan
查看>>
搭建远程容灾备份系统
查看>>
利用数据库漏洞扫描评估数据库安全性 1 概述
查看>>
分享7个我常去的国外Ajax&Jquery网站
查看>>
qq自动传文件病毒变种分析及手工查杀一例
查看>>
利用%5c绕过密码验证(不错)
查看>>
io负载高来源定位
查看>>
常用事件方法及技巧(七) -- Event类的常用常量
查看>>
Python 模块之fabric
查看>>
JSP的基本语法之include指令与<jsp:include>动作标识的区别
查看>>
升级Windows Phone 开发环境
查看>>
Exchange2010生产环境升级经验分享 二 (OWA重定向)
查看>>
搜狗日志Hive数据分析
查看>>
VLAN之间ACL和VACL的区别
查看>>
Python学习笔记一(Python数据类型)
查看>>
Apache整合Tomcat、集群
查看>>