zoukankan      html  css  js  c++  java
  • 生成器表达式 各种推导式

    openstack   了解即可

    def generator():
        print(123)
        yield 1
        print(456)
        yield 2
        print(789)  #按道理print(789)不执行,但是最下面遇到next了,就会打印,但是会报错
    
    g = generator()
    ret = g.__next__()
    print('***',ret)
    ret = g.__next__()
    print('***',ret)
    ret = g.__next__()
    注意这个程序和上边程序的对比
    def
    generator(): print(123) content = yield 1 # 遇见= 等号,先执行等号右边的。 print('***',content) print(456) yield 2 g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send效果和next效果一样 print('***',ret)

    send 

    send作用范围与next一样

    send的获取下一个值得效果和next效果基本一致,只是在获取下一个值得时候,给上一个的yiled的位置传一个值。

    使用send注意事项

    1,第一次使用生成器的时候,是用next获取下一个值。

    2,最后一个yiled不能接收外部的值

    3,send用的少,next用的多

    #获取移动平均值
    def average():
        sum = 0
        count = 0
        avg = 0
        while 1:
            num = yield avg
            sum += num
            count += 1
            avg = sum/count
    
    avg_g = average()
    avg_g.__next__()
    avg1 = avg_g.send(10)
    avg1 = avg_g.send(20)
    print(avg1)

    预激生成器的装饰器

    def init(func):   #func = average()
        def inner(*args,**kwargs):
            g = func(*args,**kwargs)  #g=average()
            g.__next__()   #注意哦
            ⑩③return g
        return inner
    
    @init   #average = init(averrage) = inner
    def average():
        sum = 0
        count = 0
        ⑩①avg = 0
        while 1:
            ⑩⑥num = ⑩②yield avg⑩⑩
            ⑩⑦sum += num
            ⑩⑧count += 1
            ⑩⑨avg = sum/count
    
    ⑩④avg_g = average()⑥
    ⑩⑩①ret = ⑩⑤avg_g.send(10)
    ⑩⑩②print(ret)

    yield from

    def generator():
        a = '12345'
        b = 'abcde'
        yield from a #yiled from a  =  #for i in a:
        yield from b                      #yiled i
    
    g = generator()
    for i in g:
        print(i)

    列表推导式

    print([i for i in range(10)])

    结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    egg_list = (['鸡蛋%s' %i for i in range(10)])
    print(egg_list)

    结果 ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

    生成器表达式

    g = (i for i in range(10))   #注意与列表推导式区别就在括号变了
    g = (i for i in range(10))     #这时的g就是生成器了,打印g结果是<generator object <genexpr> at 0x000001F1442CEF10>
    print(g)
    for i in g :
        print(i)

    注意,列表推导式和生成器表达式的区别

    1,括号不一样

    2,返回值不一样

    3,生成器表达式返回的是内存地址,所以几乎不占内存

    各种推导式:列表推导式   集合推导式   字典推导式    (元祖没有推导式)

    列表推导式

    print([i for i in range(10)])

    结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    egg_list = (['鸡蛋%s' %i for i in range(10)])
    print(egg_list)

    结果 ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

    [每一个元素或者相关元素的操作  for  元素  in  可迭代的数据类型]

    [满足条件的元素相关操作  for  元素  in  可迭代的数据类型  if  元素相关条件]    完整的列表推导式

    ret = [i for i in range(30) if i%30 == 0]  #完整的列表推导式
    print(ret)

    注意:在列表推导式中先看if   

    1,如果有if ,列表里元素的个数不一定都在新列表里

    2,如果没有if,列表里元素对应的个数会和新列表里元素的个数一样

    列表嵌套

    names = [['jake','tom','steven'],['alice','jill','eva']]
    ret = [name for li in names for name in li if name.count('e') == 2]
    print(ret)

     

    字典推导式

    例一:将一个字典的key和value对调

    dic = {'a':1,'b':2}
    dic1 = {dic[k]:k for k in dic}
    print(dic1)

    集合推导式

    例:计算列表中每个值的平方,自带去重功能

    squared = {x**2 for x in [1, -1, 2]}
    print(squared)
    # Output: set([1, 4])

    练习题:

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

    li = ['abcd','edft','asd']
    li1 = [i.upper() for i in li if len(i) >= 3]
    print(li1)
  • 相关阅读:
    Azure DevOps上使用git push --force遇到的问题
    Redis常用的一些基本命令
    [Vue warn]: Error in v-on handler: "TypeError: this.onConfirm(...).then is not a function"
    政采云:数据可视化探索之SpreadJS 表格控件
    用Java写一个折半查找
    springboot 集成hibernate 多数据源链接
    java 自定义注解
    幻读:听说有人认为我是被MVCC干掉的
    懵了!女朋友突然问我MVCC实现原理
    不会MySQL索引,面试官让回家等通知!
  • 原文地址:https://www.cnblogs.com/aaronthon/p/8183619.html
Copyright © 2011-2022 走看看