zoukankan      html  css  js  c++  java
  • 生成器和生成器表达式

    什么是生成器?

    def func():
        print("含有yield的是生成器")
        yield 10#返回值
    ret=func()#函数并不执行  而是记录代码
    print(ret)#当使用到函数时 开始执行 获取到的是生成器
    #生成器和迭代器类似,可以使用__next__来获取到下一个值

    例如

    def func():
        print("111")
        yield 222
    gen=func()
    ret=gen.__next__()
    print(ret)
    
    》》》111
    222

    列表推导式

     取1-100的奇数

    lst=[i for i in range(1,101) if i%2==1]
    print(lst)

    对比之前的想法

    lst=[]
    for i in range(1,101):
        if i %2==1:
            lst.append(i)
    print(lst)

    [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

    字典推导式

    lst1=["东北","山西","山东"]
    lst2=["大乱炖","老陈醋","大饼"]
    dic={lst1[i]:lst2[i] for i in range(len(lst1))}
    print(dic)

    一个面试题. 难度系数500000000颗星:

    def add(a, b):
        return a + b
    def test():
        for r_i in range(4):
          yield r_i
    g = test()
    for n in [2, 10]:
        g = (add(n, i) for i in g)
    print(list(g))

    推导过程思路主要利用生成器的特性 不调用或者执行的时候不会给值

    def add(a, b):#a+b
        return a + b
    def test():#0-3
        for r_i in range(4):
            yield r_i
    g = test()#函数不执行,获取到的是生成器
    for n in [2, 10]:#这个循环获取到列表中的两个值,(巨坑开始)
        g = (add(n, i) for i in g)
    print(list(g))

    把for循环拆开分析

    n=2
    g = (add(n, i) for i in g)#注意  这里并不执行代码  而是记录代码
    n=10
    g = (add(n, i) for i in g)#这里的第二个g,已经替换成n=2时的g = (add(n, i) for i in g)

    n=2
    g = (add(n, i) for i in g)#注意  这里并不执行代码  而是记录代码
    n=10
    g = (add(n, i) for i in (add(n, i) for i in g))#这里的第二个g,已经替换成n=2时的g = (add(n, i) for i in g)

    def add(a, b):#a+b
        return a + b
    def test():#0-3
        for r_i in range(4):
            yield r_i
    g = test()#函数不执行,获取到的是生成器
    n=10
    g = (add(n, i) for i in (add(n, i) for i in g))
    print(list(g))#函数开始执行

    》》》[20, 21, 22, 23]

    友情提示: 惰性机制, 不到最后不会拿值
    这个题要先读一下. 然后自己分析出结果. 最后用机器跑一下.

    1,用列表推导式做下列小题

    (1) 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

    lst1=[["abc"],["ad"],["adadag","a","bad"]]
    lst=[i for i in lst1 if len(i)>=3 ]
    print(lst)

    (2) (x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

    lst1=[i for i in range(1,6) if i%2==0],[j for j in range(1,6) if j%2==1]
    print(lst1)

    (3) M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

    M = [[1,2,3],[4,5,6],[7,8,9]]
    lst=[i1 for i in M for i1 in i if i1%3==0]
    print(lst)

    (4) 求出50以内能被3整除的数的平方,并放入到一个列表中。

    lst=[i**2 for i in range(1,51) if i%3==0]
    print(lst)

    (6) 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

    # (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    lst=[(i,i+1)for i in range(6)]
    print(lst)

    (7) 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    lst=[i for i in range(20) if i%2==0]
    print(lst)

    (8) 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']

    l1 = ['alex', 'WuSir', '老男孩', '太白']
    
    lst=[l1[i]+"%s"%i for i in range(len(l1))]
    print(lst)

    (9)有以下数据类型:

    x = {
        'name':'alex',
        'Values':[{'timestamp':1517991992.94,
             'values':100,},
            {'timestamp': 1517992000.94,
            'values': 200,},
            {'timestamp': 1517992014.94,
             'values': 300,},
            {'timestamp': 1517992744.94,
             'values': 350},
            {'timestamp': 1517992800.94,
             'values': 280}
    ],}

    将上面的数据通过列表推导式转换成下面的类型:[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]

    x = {
        'name':'alex',
        'Values':[{'timestamp':1517991992.94,
             'values':100,},
            {'timestamp': 1517992000.94,
            'values': 200,},
            {'timestamp': 1517992014.94,
             'values': 300,},
            {'timestamp': 1517992744.94,
             'values': 350},
            {'timestamp': 1517992800.94,
             'values': 280}
    ],}
    lst=[[dic['timestamp'],dic['values']] for dic in x["Values"] ]
    print(lst)
  • 相关阅读:
    41:和为S的两个数
    40:数组中只出现一次的数字
    39-2:平衡二叉树
    39:二叉树的深度
    38:数字在排序数组中出现的次数
    37:两个链表的第一个公共结点
    36:数组中的逆序对
    35:第一个只出现一次的字符
    34:丑数
    33:把数组排成最小的数
  • 原文地址:https://www.cnblogs.com/bigc008/p/9669001.html
Copyright © 2011-2022 走看看