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

    1,             生成器的本质就是迭代器

                   生成器的三种创建办法:     (1):通过生成器函数创建  (2)通过生成器表达式创建生成器  (3) 通过数据转换

    2,各种推倒式和生成器表达式:

                     (1):  列表推倒式                        如:     lis =  [结果 for 变量 in 可迭代对象 if 筛选]

                                                                                lst = ['python%s' % i for i in range(1,15)]            print(lst)  

                                                                                lst = [i for i in range(1, 100) if i % 2 == 0            print(lst)  

                           生成器表达式和列表类似:     如:   gen = (i for i in range(10))                                  print(gen)    =====>         <generator object <genexpr> at 0x106768f10>

                                                                                gen = (i for i in range(1,100) if i % 3 == 0)     生成器表达式可以直接获取到生成器. 生成器可以直接进行for循环. 生成器具有惰性机制

                                                                                for num in gen:            ======>print(num)

                           区别:   同样一篮子鸡蛋. 列表推导式: 直接拿到一篮子鸡蛋. 生成器表达式: 拿到一个老母鸡. 需要鸡蛋就给你下鸡蛋.

                                      得到的值不一样. 列表推导式得到的是一个列表. 生成器表达式获取的是一个生成器.      列表推导式耗内存,生成器表达式获取的是一个生成器

                  (2):  字典推倒式                 如:     {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value

                                                                  lst1 = ['jay', 'jj', 'sylar']         lst2 = ['周杰伦', '林林俊杰', '邱彦涛']          dic = {lst1[i]: lst2[i] for i in range(len(lst1))}      print(dic)      

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

                  (3):  集合推导式   ( 集合推导式自带去重功能)     注意abs是个内置函数取绝对值的命令,无论正负只取值

                                                      如:     lst = [1, -1, 8, -8, 12]             s = {abs(i) for i in lst}                print(s) 

                   (4):    生成器函数        

    def eat():
        print("我吃什什么啊")                注意:  yield是分段来执行一个函数,区别于列表推导式优点是节省内存(高价架构师方向)
        a = yield "馒头"                                   send和next()都是让生成器向下走一次, send可以给上一个yield的位置传递值
        print("a=",a)                                         send不能给最后一个yield发送值. 在第一次执行生成器代码的时候不能使用send()
        b = yield "大饼"
        print("b=",b)
        c = yield "韭菜盒子"
        print("c=",c)
        yield "GAME OVER"                            当程序运行完最后一个yield. 那么后面继续进行__next__()程序会报错

                   gen = eat() # 获取生成器
                   ret1 = gen.__next__()
                   print(ret1)
                   ret2 = gen.send("胡辣汤")                 =====>   将   '胡辣汤'  赋值给a                         
                   print(ret2)                                                                                                                     
                   ret3 = gen.send("狗粮")                    =====>   将   '狗粮'  赋值给a
                   print(ret3)
                   ret4 = gen.send("猫粮")                    =====>   将   '猫粮'  赋值给a
                   print(ret4)

                        

                  

                        

  • 相关阅读:
    zoj-1610线段树刷题
    poj-3268最短路
    poj-2528线段树练习
    线段树-最小逆序数hdu1394
    线段树延迟更新
    hdu-4027线段树练习
    RMQ_第一弹_Sparse Table
    字符串hash与字典树
    背包问题
    网络流
  • 原文地址:https://www.cnblogs.com/laogao123/p/9330868.html
Copyright © 2011-2022 走看看