码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器

时间:2018-05-01 20:27:15      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:utf-8   src   iter   集合   spl   例子   生成   instance   sum   

一迭代器

1.1)什么是可迭代?

凡是可以使用for循环取值的都是可迭代的
列表 字典 元祖 字符串  集合 range 文件句柄 enumerate 这些都是可迭代的


for i in (1,2,3,4):
     print(i)
1.2)可迭代协议
可迭代协议:内部含有_iter_方法都是可迭代的
迭代器协议:内部含有_next_方法都是迭代器
迭代器的优势
节省内存
#快
# 取一个值就进行接下来计算,二不需要等到所有的值都计算出来才开始接下来的运算-

from  collections import Iterable,Iterator
print(range(1,10000))
print(isinstance(range(10000),Iterable))
print(isinstance(range(10000),Iterator))

 

迭代器的特性:惰性运算



二、生成器
一个包含yield关键字的函数就是一个生成器函数。
yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。
每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束


生成器的例子
假如我想让工厂给学生做校服,生产2000000件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
而不能是一说要生产2000000件衣服,工厂就先去做生产2000000件衣服,等回来做好了,学生都毕业了。。。
技术分享图片
def cloth(num):
    for i in range(num):
        yield  ("生产第%s件衣服" %i)#记录当前所在的位置,等待下一次next来触发函数的状态
        # print("生产第%s件衣服" %i)
#
g=cloth(5)
for i in g:
    print(i)
View Code

 


g=cloth(5)
for i in g:
print(i)
# print(next(g))
# print(next(g))

生成器函数的调用不会触发代码的执行,而是会返回一个生成器(迭代器0

想要生成器函数执行要用next

生成器的应用
#使用生成器来监听文件
import  time
def listener_files():
    with open(access.log,mode=r,encoding=utf-8) as  f:
        while True:
            line=f.readline()
            if line.strip():
                yield  line.strip()
            else:
                time.sleep(1)



g=listener_files()
for line in g:
    print(line)

  2.计算移动工资

def agv_monery():
    sum_monery=0
    day=0
    argv_moeny=0
    while True:
        monery=yield argv_moeny
        day += 1
        sum_monery +=monery
        argv_moeny=sum_monery/day




g=agv_monery()
print(next(g))
print(g.send(300))
print(g.send(500))

三、列表表达式

 

 
 
 


迭代器和生成器

标签:utf-8   src   iter   集合   spl   例子   生成   instance   sum   

原文地址:https://www.cnblogs.com/Robi-9662/p/8976935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!