python之路4

迭代器&生成器

迭代器:

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这 之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

    访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
    不能随机访问集合中的某个值 ,只能从头到尾依次访问
    访问到一半时不能往回退
    便于循环比较大的数据集合,节省内存

 vim与cat/more/less区别:

当读取一个较为大的文件使用vim时会先将内容加载到内存中,数据越大耗费时间越多。使用cat等会逐行依次读进内存中,节约时间。cat必须从头到尾无法进行后退跳跃。

迭代器:

1 names = iter(['wang1','wang2','wang3'])#生成迭代器
2 print(names.__next__())#取值wang1
3 print(names.__next__())#取值wang2
4 print(names.__next__())#取值wang3
5 #只能从开头依次去取值
生成迭代器取值
f=open('1.txt')
f.read()
f.readlines()
for line in f:
    print(line)
读取文件的时候不建议使用read/readlines等,因为这样会将所有文件都读取到内存中,应该使用循环方法,将文件赋予到一个值逐行进行读取这样会默认生成一个迭代器在python2.X系列有一个xreadlines就是生成迭代器,python3已经废弃

生成器generator:

定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器

 1 def cash_out(amount):
 2     while amount >0:
 3         amount -= 1
 4         yield 1<br>        print("擦,又来取钱了。。。败家子!")
 5  
 6  
 7  
 8 ATM = cash_out(5)
 9  
10 print("取到钱 %s 万" % ATM.__next__())
11 print("花掉花掉!")
12 print("取到钱 %s 万" % ATM.__next__())
13 print("取到钱 %s 万" % ATM.__next__())
14 print("花掉花掉!")
15 print("取到钱 %s 万" % ATM.__next__())
16 print("取到钱 %s 万" % ATM.__next__())
17 print("取到钱 %s 万" % ATM.__next__()) #到这时钱就取没了,再取就报错了
18 print("取到钱 %s 万" % ATM.__next__())
View Code

作用:

这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

另外,还可通过yield实现在单线程的情况下实现并发运算的效果

 

转载于:https://www.cnblogs.com/dahuige/p/5184649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值