生成器與列表推導式

生成器

本質就是迭代器,他是python本身用代碼寫的迭代器python

用如下兩種方式構建一個生成器
  1.經過生成器表達式
  2.聲稱器表達式
生成器函數
# def func(x):
#     x+=1
#     print(111)
#     print(111)
#     yield x
#     x+=2
#     print(222)
#     yield 'alex'
#     x+=3
# g_obj=func(5)
# print(g_obj)
# print(g_obj.__next__())
# print(g_obj.__next__())
# 一個next對應一個yield
# yield將值返回給 生成器對象.__next__()


return 結束函數,給函數的執行者一個返回值yield
不會結束函數,一個next 對應一個yield,
給生成器對象.__next__()返回值

生成器迭代器的區別
  生成器函數,vs迭代器
  區別1:自定製的區別

# l1=[1,2,3,4,5]
# print(l1.__iter__())

# def func1(x):
#     x+=1
#     yield x
#     x+=3
#     yield x
#     x+=5
#     yield x
# g1 =func1(5)
# print(g1.__next__())
# print(g1.__next__())
# print(g1.__next__())
內存級別的區別
  迭代器須要可迭代對象進行轉化,可迭代對象很是佔內存
  生成器直接建立,不須要轉化,從本質上就節省內存


 send 與next

# def func1():
#     print(1)
#     count=yield 6
#     print(count)
#     print(2)
#     count1=yield 7
#     print(count1)
#     print(3)
#     yield 8
# g=func1()
# # print(func1())
# next(g)
# g.send('alex')
# g.send('alex')
# print()
# g.send('太白')
# g.send('太白')

 

·send 與next同樣,也是對生成器取值,(執行一個yield,取一次值)的方法
send能夠給上一個yield 傳值
第一次取值永遠都是next
最後一個yield 永遠也得不到send傳的值


# def cloth1(n):
# #     for i in range(n+1):
# #         print('衣服%s號' %i)
# # cloth1(10000)

# def cloth2(n):
#     for i in range(1,n+1):
#         yield '衣服的%s號' % i
# g=cloth2(10000)
# for i in range(50):
#     print(g.__next__())
# for i in range(50):
#     print(g.__next__())

 

 

列表推導式

列表推導式:一行代碼幾乎搞定你須要的任何列表
循環模式,[變量 (加工後的變量) for 變量 in iterable]
# li=[i for i in range(1,101)]
# print(li)
 篩選模式,[變量 (加工後的變量) for 變量 in iterable if 條件]

# l1=[i for i in range(1,31) if i%3==0]
# # print(l1)
 列表推導式
優勢:一行解決,方便
缺點:不易排錯,不能超過3次循環

 生成器表達式:將列表推導式的[]換成()便可
 
# g=(i for i in range(100))
# print(g)
# print(g.__next__())
# print(g.__next__())

 

 字典推導式
字典的鍵和值對調

# mcase={'a':10,'b':34}
# # mcase_frequency={mcase[k]:k for k in mcase}
# # print(mcase)

# squared={x**2 for x in [1,-1,2]}
# print(squared)
相關文章
相關標籤/搜索