zoukankan      html  css  js  c++  java
  • 生成器

    1生成器

      生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式也有相同之处(__next__  send()是给上一个yiel传值

      生成器一般是由生成器函数或者生成器表达式创建

    2生成器函数

      和普通函数一样,只是函数中含有yield的函数就是生成器函数,

      生成器函数在执行的时候,默认返回的是生成器,不会执行函数的内容操作.执行内容操作需要用__next__才可以

      send()给上一个yield传值,第一次执行生成器代码的时候不能使用send(),最后yield结束程序时也不能使用send()传值

      send()与__next相同之处是都是向前运行一步,区别是send()传值,__next__是读取函数

    def s():
        print("111")
        q = yield 222
        print(q)
        print("333")
        w =yield 444
        print(w)
        print("555")
        e = yield 666
        print(e)
        print("777")
        r = yield "完了"
        print(r)
    a = s()
    # print(a)# 结果<generator object s at 0x000001EBBA7D0F10> 获取生成器
    b = a.__next__()# 111
    print(b)# 222
    c = a.__next__() # None 333
    print(c) #444
    d = a.send(888) #888 555
    print(d) #666
    e = a.send("牛肉汤")# 牛肉汤 777
    print(e) # 完了
    f = a.__next__()#  f = a.__next__()#StopIteration
    print(f)
    

      

    3推导式:通过一行代码来构建你要的列表, 看起来代码简单,但是出错误以后排错很难.

      <1>列表推导式:lst=[结果,for循环,条件筛选]

    lst = [i for i in range(100) if i % 2 == 0]
    print(lst)  #结果为[0,2,4,6...98]  100以内的偶数
    

      

      <2>字典推导式:dic={k,v for循环,条件筛选}

    #要求:把dic的key值与value调换
    
    dic={1:"唐僧",2:"悟空",3:"八戒",4:"沙师弟"}
    dic_new={v:k for k,v in dic.items()}
    print(dic_new) # {'唐僧': 1, '悟空': 2, '八戒': 3, '沙师弟': 4}
    

      

      <3>集合推导式:s = {k,for循环,条件}     #集合推导式可以自动帮我们生成一个集合,集合的特点是无序,不重复.自带去重功能.

    要求:对列表内的内容去重
    
    lst = [1,2,1,6,3,7,8,9,6,5,8,4]
    s = {abs(i) for i in lst}
    print(s)#结果{1, 2, 3, 4, 5, 6, 7, 8, 9}
    

     总结:推导式有列表推导式,字典推导式,集合推导式,没有元组推导式 

    4生成器表达式:(结果 for循环 条件)

    特点:1惰性机制 2 节省空间(鸡蛋)3只能向前

     # 去掉列表中带有字母d并且出现过一次的字符串
    names=[["andy","monedy","tuesday","third"],["sunday","friday","wangjun","666"]]
    gen = (el for i in names for el in i if el.count("d")==1 )
    for m in gen:
        print(m) 结果  #andy
                        #monedy
                        #tuesday
                        #third
                        #sunday
                        #friday
    

      总结:列表表达式与生成器表达式的区别:1生成器表达式和列表推导式的语法基本上是⼀一样的. 只是把[]替换成()

                       2列表表达式一次性加载,占用内存较多,生成器表达式只是在调用时才分配和占用内存,节省空间

                       3结果不一样,列表表达式得到的是一个列表,生成器表达式得到的是一个生成器

    练习题

    # (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    # lst =["alex", "wu","wukai", "chenyifa", "mo", "ti", "feng"]
    # lst_new=[i.upper()for i in lst if len(i)>3]
    # print(lst_new)   # 结果为['ALEX', 'WUKAI', 'CHENYIFA', 'FENG']
    #
    #
    # (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    # s = [(x,y)for x in range(5) if x %2==0 for y in range(5) if y %2==1]
    # print(s)   # 结果为[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
    #
    #
    # (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 = [[x, y, z] for x in M[0] if x == 3 for y in M[1]if y == 6 for z in M[2]if z == 9]
    # print(lst) # 结果 [[3, 6, 9]]
    #
    #
    #  (4)求出50以内能被3整除的数的平方,并放入到一个列表中。
    # ls=[i*i for i in range(50) if i%3==0 ]
    # print(ls)  #[0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304]
    #
    #
    #  (5)构建一个列表:['python1期', 'python2期',
    # 'python3期', 'python4期', 'python6期', 'python7期',
    # 'python8期', 'python9期', 'python10期']
    # l=["python%s期"% s for s in range(1,11)]
    # print(l)  #结果为 ['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    #
    #
    # (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    # l1=[(x,x+1)for x in range(6)]
    # print(l1)#  [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    
    # (7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    # l2=[s for s in range(19)if s%2==0]
    # print(l2)  #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    
    #(8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']
    # 将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
    # l1 = ['alex', 'WuSir', '老男孩', '太白']
    # l3 = [l1[a]+str(a) for a in range(len(l1))]
    # print(l3)  #['alex0', 'WuSir1', '老男孩2', '太白3']
    
    
    #(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]]
    # l4=[[k['timestamp'],k['values']]for k in x['Values']]
    # print(l4)# 结果为[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
  • 相关阅读:
    Kotlin调用lambda表达式时,lambda中的参数名字省略问题
    Kotlin读取控制台输入
    安卓P(9)及以上Cleartext HTTP traffic to xxx not permitted错误,无法HTTP明文连接错误解决方法
    AS4.0以上查看R.id
    Kotlin Standard.kt解析(also,apply,let.run...)
    ext4文件解包打包
    Kotlin中的var、val和const
    Kotlin的构造方法探究
    Markdown语法
    uniapp遇到的小问题
  • 原文地址:https://www.cnblogs.com/lingcai/p/9470444.html
Copyright © 2011-2022 走看看