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')
posted @ 2019-03-18 12:42  东小东  阅读(503)  评论(0编辑  收藏  举报