python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式
1.生成器
生成器的本質是迭代器。
在python中有三種方式來獲取生成器
1.通過生成器函數
2.通過各種推到式來實現生成器
3.通過數據的轉換也可以獲取生成器
#函數
deffunc():print('這是函數func')return '函數func'func()#生成器
deffunc1():print('這是函數func1')yield '函數func'func1()#結果:
def foo(): #yield 關鍵字
print(1)yield 4 #yield 返回值 記錄執行到哪里 停止
print(2)yield 5g= foo() # #產生一個生成器
print(g.__next__()) #g.__next__ 觸發啟動這個生成器
print(g.__next__()) #g.__next__ 觸發啟動這個生成器
生成器定義: 函數體中存在yield就是生成器,函數+()就產生 生成器
1.生成器 只能向下執行
2.正常函數中,函數+()調用在個函數
yield和return的效果是一樣的,但是還是有點區別:
yield是分段來執行一個函數
return是直接停止這個函數
deffunc():print("111")yield 222
print("333")yield 444gener=func()
ret= gener.__next__()print(ret)
ret2= gener.__next__()print(ret2)
ret3= gener.__next__()#最后?個yield執?完畢. 再次__next__()程序報錯
print(ret3)
結果:111
222
333
444
當程序運行完最后一個yield,那么后面繼續運行__next__()程序會報錯。__next__ 和 yield 要一一對應, 最后的一個yield下邊能寫就是不運行。
生成器是一個一個的,一直向下進行,不能向上.__next__()到哪,指針就指到哪兒.下一次繼續就獲取指針指向的值。
生成器的好處:節省空間
#面試題
deffoo():deffunc():print(1)yield 4
returnfunc
f=foo()
g=f()print(g.__next__())
send方法
send和__next__()一樣都可以讓生成器執行到下一個yield
defeat():for i in range(1,10000):
a= yield '包子'+str(i)print('a is',a)
b= yield '窩窩頭'
print('b is', b)
e=eat()print(e.__next__())print(e.send('大蔥'))print(e.send('大蒜'))
send和__next__()區別:
1.send 和 next()都是讓生成器向下走一次。
2.send可以給上一個yield的位置傳遞值,不能給最后一個yield發送值,在第一次執行生成器的時候不能使用send()
3.第一次調用的時候使用send()也可以但是send的參數必須是None
生成器可以for循環來循環獲取內部元素:
deffunc():yield 1
yield 2
yield 3
yield 4
yield 5f=func()for i inf:print(i)
yield from
在python3中提供一種可以直接把可迭代對象中的每一個數據作為生成器的結果進行返回
deffunc():
lst= ['衛龍','老冰棍','北冰洋','牛羊配']yield fromlst
g=func()for i ing:print(i)
deffunc():
lst= ['衛龍','勞賓光','北冰洋']
lst2= ['aa','老冰棍','北冰洋123']yield fromlstyield fromlst2
g=func()for i ing:print(i)#注意:yield from 是將列表中的每一個元素返回,所以 如果寫兩個yield #from 并不會產生交替的效果
2.推導式
列表推導式
列表推導式的常?寫法:
[結果?for?變量?in?可迭代對象]
ls = [i for i in range(10)]print(ls)
篩選模式
[結果 for 變量 in 可迭代對象 if 條件]
li = [i for i in range(10) if i > 3]print(li)
字典推導式
lst1 = ['1','2']
lst2= [2,3]
d= {lst1[i]:lst2[i] for i in range(2)}print(d)
集合推導式
dic = {'1':2,'3':4}
d= {i for i indic.items()}print(d)
生成器推導式: 長得像元組的推導式 其實是生成器推導式 #沒有元組推導式
li = (i for i in range(100) if i>3)for i in range(10):print(li.__next__())
生成器表達式和列表推導式的區別:
1. 列表推導式比較耗內存,一次性加載.生成器表達式幾乎不占用內存.使用的時候才分配和使用內存
2. 得到的值不一樣,列表推導式得到的是一個列表.生成器表達式獲取的是一個生成器
生成器的惰性機制: 生成器只有在訪問的時候才取值,說白了.你找他要才給你值.不找他要.他是不會執行的.
deffunc():print(111)yield 222g= func() #生成器g
g1= (i for i in g) #生成器g1. 但是g1的數據來源于g
g2= (i for i in g1) #生成器g2. 來源g1
print(list(g)) #獲取g中的數據. 這時func()才會被執行. 打印111.獲取到222. g完畢.
print(list(g1)) #獲取g1中的數據. g1的數據來源是g. 但是g已經取完了. g1 也就沒有數據了
print(list(g2)) #和g1同理理
print(next(g))print(next(g1))print(next(g2)) #可以用next來驗證 其實list就是將內容迭代了轉換成了列表
注意:生成器是要值的時候才能拿值
總結:
1.推導式有, 列表推導式, 字典推導式, 集合推導式,?沒有元組推導式
2.生成器表達式: (結果 for 變量量 in 可迭代對象 if 條件篩選)
3.生成器表達式可以直接獲取到?成器對象. ?成器對象可以直接進行for循環. ?成器具有惰性機制.
3.面試題
defadd(a, b):return a +bdeftest():for r_i in range(4): #[0,1,2,3]
yieldr_i
g=test()for n in [5,10]:
g= (add(n, i) for i ing)print(list(g))#拆解:#n = 2#g1 = (add(n,i) for i in g) #[10,11,12,13]#n = 10#g2 = (add(n,i) for i in g1) #[20,21,22,23]#print(list(g2))#結果 [20,21,22,23]
總結
以上是生活随笔為你收集整理的python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wpf 动画_WPF中监视动画进度
- 下一篇: waf可以查看post请求吗_WAFNi