zoukankan      html  css  js  c++  java
  • 生成器-推导式

    生成器

    生成器:自己定义一些函数 惰性机制 本质就是迭代器

    迭代器:使用自己写好的数据结构元素

    yield      产生生成器

    def foo():
        print(1)
        yield 4              #yield 返回值    记录执行到哪,停止,不往下执行
        print(2)
        yield 5
    g = foo()                  
    print(g.__next__())       #触发启动生成器

    yield要和next个数一一对应,最后一个yield下边的代码不运行

    生成器定义:函数体中存在yield就是生成器,函数名()就产生生成器

    def foo():
        print(1)
        yield 4 
        print(2)
        yield 5
    g = foo()                  #产生生成器
    g.__next__()            #调用yield的返回值 返回给g.__next__()

    生成器的好处:节省空间

    send()
    相当于__next__ + 传值 在外界向生成器传递参数

    def func():
        print(44)
        l = yield 5
        print(22)
        print(l)
        yield 66
    g = func()
    print(g.__next__())
    print(g.send(55))           #传值给上一个yield 赋给l,然后向下运行
    
    结果:
    44
    5
    22
    55
    66

    send不能在第一次使用.如果想把send在第一次使用,找不到上一个yield去赋值,会报错.但是可以send(None),就可以继续向下运行

    第一次启动生成器的时候,使用生成器.__next__ 或 生成器.send(None)

    yield from

    实现循环 必须是可迭代数据    只能使用__next__

    def func():
        lst = [1,2,3,4]
        yield from lst                        #相当于 for i in lst:   
    g = func()                                               #yield i
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    
    结果:
    1
    2
    3
    4

    推导式

    1.列表推导式

    li = [i for i in range(10)]       #[结果 语句]     不能加:和,
    print(li) 
    li = [i for i in range(10) if i % 2 == 0]          #if语句 [结果 语句 条件]
    print(li)
    li = [i for i in range(10) if i > 3 if i%2 ==0]             #if嵌套
    print(li)
    
    结果:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 2, 4, 6, 8]
    [4, 6, 8]
    
    
    
    #只能走一条线 不能用elif

    2.集合推导式

    print({i for i in range(10) if i>4})
    
    dic = {'1':2,'2':3}
    d = {i for i in dic.items()}
    print(d)
    
    结果:
    {5, 6, 7, 8, 9}
    {('1', 2), ('2', 3)}

    3.字典推导式

    lst1 = ['1','2']
    lst2 = [2,3]
    d = {lst1[i]:lst2[i] for i in range(2)}
    print(d)
    
    dic = {'1':2,'2':3}
    print({k:v for k,v in dic.items()})
    
    结果:
    {'1': 2, '2': 3}
    {'1': 2, '2': 3}

    4.生成器推导式

    长的像元祖推导式,但是需要记住,元祖没有推导式

    l = (i for i in range(100) if i%3 ==0)
    for i in range(10):
        print(l.__next__())

    展开:

    def l():
        for i in range(100):
            if i > 3:
                yield i
    g = l()
    for i in range(10):
        print(g.__next__())

    筛选:

    l = (i for i in range(10) if i > 3)
    for i in range(10):
        print(l.__next__())
  • 相关阅读:
    极客技术专题【008期】:CSS3核心技术:选择器
    10670 Work Reduction (贪心 + 被题意坑了- -)y
    hdu 4617 : Weapon
    [poj 2186]Popular Cows[Tarjan强连通分量]
    caldera
    linux内核书籍
    DedeCMS Error:Tag disabled:"php"的解决办法
    China特色创新现状
    麒麟OS剽窃
    国产系统
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10260329.html
Copyright © 2011-2022 走看看