python 迭代器和生成器

迭代器:

迭代器:从集合的第一个元素开始访问,到所有的元素都被访问完 ,结束,不能后退,只能往前;
迭代器的优点:不需要准备所有的元素;只有在迭代时才放入迭代器;元素之前或者之后的元素可以不存在或者时被销毁了,这个特点特别适用于遍历一个巨大的或者无限大的集合,如几个G的文件;
vi 需要准备好文件(也就是全部读取到内存里面去,当用vi去打开文件,当用cat则不同,他是通过迭代的形式来查看文件的;(从头往后的)
cat是读一行显示一行;不需要知道中间是什么,可以节省内存,只需关心next的值;

1:无需关心内部结构,仅需通过next()方法获取下一个值
2:布恩那个随机访问集合中的某一个元素;,只能从头开始访问
3:访问到一半是不能后退
4:节省内存,便于循环访问比较大的集合

读文件时不要用:
for i f.readlines 或者是for i in f.read(); 应该直接用for i in f:

生成器:generator
如果一个函数调用时返回的事一个迭代器,这个函数叫做生成器;
yield:
return 是:
def cash_out(amount):
    while(amount >0)
    amount -=1
    return 1
    #yield 1
    print ('you are ok')
 
 
迭代器:
name1 = ['alex','bluesli','blueslilu']#列表的生成
name2 = iter(['alex','bluesli','blueslilu'] )#生成一个迭代器对象
print(name1)
print(name2.__next__()) #2.7的是直接next而3.x是__next__()
print(name2.__next__())
print(name2.__next__())
生成器:
 
 
def cash_out(amount):
    while amount >0:
        amount -=100
        # return 1
        yield 100
        print ('又来取钱了')


atm= cash_out(500)#这一步没有正正的执行,知识生成了一个迭代器;
print(type(atm))
print(atm.__next__())
print(atm.__next__())
print('大保健....')
print(atm.__next__())
print(atm.__next__())
print(atm.__next__())

#通过yield可以生成一个迭代器;
# 异步的需求
#函数执行了一半去干别的事情,回来之后还能回到断点;
# 生成器简单的实现了一个异步的需求,可以保存程序的断点;
# 第一次是显示100(yield会直接返回)当进入下一次继续来执行的时候又回到yield的断点,继续执行下面的内容),第二次是又来取钱了再取钱,然后yield,接下来就是重复了,

 
 

猜你喜欢

转载自blog.csdn.net/weixin_38859557/article/details/80425493