• 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')
  • 相关阅读:
    T3984 迷宫问题 TJ
    P1091 合唱队形 TJ
    P4549 【模板】裴蜀定理
    牛客NOIP集训一S 牛牛的方程式 TJ
    P3387 【模板】缩点 TJ
    [数字图像处理](三)对数变换
    [数字图像处理](四)直方图均衡化[HE]算法
    [ACM]KMP算法的两种写法,从0开始,从1开始
    [计算几何]补题
    [Servlet]IJ idea搭建Servlet初步
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10423712.html
Copyright © 2020-2023  润新知