生成器和生成器表達式

1,             生成器的本質就是迭代器python

               生成器的三種建立辦法:     (1):經過生成器函數建立  (2)經過生成器表達式建立生成器  (3) 經過數據轉換架構

2,各類推倒式和生成器表達式:函數

                 (1):  列表推倒式                        如:     lis =  [結果 for 變量 in 可迭代對象 if 篩選]spa

                                                                            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>generator

                                                                            gen = (i for i in range(1,100) if i % 3 == 0)     生成器表達式能夠直接獲取到生成器. 生成器能夠直接進行for循環. 生成器具備惰性機制for循環

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

                       區別:   一樣一籃子雞蛋. 列表推導式: 直接拿到一籃子雞蛋. 生成器表達式: 拿到一個老母雞. 須要雞蛋就給你下雞蛋.
object

                                  獲得的值不同. 列表推導式獲得的是一個列表. 生成器表達式獲取的是一個生成器.      列表推導式耗內存,生成器表達式獲取的是一個生成器

              (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)

相關文章
相關標籤/搜索