Python档案袋(生成器、迭代器、队列 )
生成器:
简单的生成器实现:
1 #生成器,将for循环的变量传递到前面的式子进行处理 2 #生成的并不是一个列表,而是一个存在算数规则的对象 3 #不能通过下标直接取值,必须一个一个从头到尾取 4 va=(i*2 for i in range(10)) 5 print(va) 6 7 #调用下一个,只记住当前位置,相当于有一个游标,只能向下 8 print(va.__next__()) #输出:0 9 print(va.__next__()) #输出:2 10 11 #变量生成器 12 for i in va: 13 print(i) #输出:#4 6 8 10 12 14 16 18
生成器进阶:
1 def funx1(max): 2 m,x,y=0,0,1 3 while m<max: 4 #print(y) #1 1 2 3 5 8 13 21 34 55 5 yield y #生成器输出,使用for循环或者next方法才会输出 6 x,y=y,(x+y) 7 m+=1 8 9 #普通调用 10 #funx1(10) 11 12 #生成器调用 13 funx=funx1(10) 14 print(funx.__next__()) 15 print("----- 可输出 ------") 16 print("取值方法1:",funx.__next__()) 17 print("取值方法2:",next(funx))
生成器发送数据:
1 def funx1(): 2 while True: #如果不写则启动就结束了,不能继续发数据 3 res=yield 4 print("获取的结果:",res) 5 6 #生成器调用 7 funx=funx1() 8 funx.send(None) #必须先启动生成器,无输出,也可以使用funx.__next__() 9 funx.send("------") #发送数据,输出:获取的结果: ------ 10 funx.send("******") #输出:获取的结果: ******
迭代器:
表示一个数据流,可以无限大
可使用for循环的对象都是可迭代对象,如字符串、列表、字典等,可使用next(对象)的对象都是迭代器对象
可迭代对象可以通过iter方法变成迭代器对象
1 strx="abcdefghigk" 2 3 #转换为迭代器 4 va=iter(strx) 5 6 print(next(va)) #输出:a 7 print(next(va)) #输出:b
队列:
可自定义先入先出还是后人先出,数据一经取出就在队列里自动去除
1 import queue 2 3 #先进先出 4 #qlistx=queue.Queue(maxsize=5) #生成实例,参数maxsize表示最大数量,超过则阻塞,等待头取出 5 #qlistx=queue.Queue() #生成实例 6 7 #后进先出 8 qlistx=queue.LifoQueue() #生成实例 9 10 11 #设置数据方法一 12 #队列满则阻塞等待 13 qlistx.put("1111111") 14 qlistx.put("2222222") 15 16 #设置数据方法二 17 #超时则报异常 18 qlistx.put("333333",timeout=1) 19 20 print(qlistx.qsize()) #输出列表大小 21 22 #取数据方法一 23 #如果取到最后没有数据,将会一直处于阻塞 24 print(qlistx.get()) 25 print(qlistx.get()) 26 27 #取值方法二 28 #设置超时时间,超时则报异常 29 print(qlistx.get(timeout=1)) 30 31 32 #取数据方法三 33 #无数据不进行阻塞,如果无数据则报异常 34 #print(qlistx.get_nowait())
优先级存取值:
值越小则优先级越高,实现高优先级最先取出
import queue qlistx=queue.PriorityQueue() #生成实例 qlistx.put((1,"1111111")) qlistx.put((-1,"2222222")) qlistx.put((100,"99999999")) print(qlistx.get()) #输出:(-1, '2222222') print(qlistx.get()) #输出:(1, '1111111')