生成器和推导式
def func():print('哈哈哈')yield 1 # return 和 yield 都可以返回數據print('呵呵呵')
gen = func() # 不會執行你的函數,拿到的是生成器
ret = gen.__next__() # 會執行到下一個yield
print(ret)
gen.__next__() # 繼續執行函數到下一個yield 函數中如果有yield 這個函數就是生成器函數,生成器函數() 獲取的是生成器,這個時候不執行函數
yield:相當于return,可以返回數據,但是yield不會徹底中斷函數,分段執行函數 def order():for i in range(100000):yield '衣服'+ str(i) g = order() # 獲取生成器 mingwei = g.__next__() print(mingwei) zhaoyinning = g.__next__() print(zhaoyinning)
# 生成器函數 # 0-3 def test():for j in range(4):yield j
# 0,1,2,3 g = test() # 獲取生成器
# 懶 for n in [1,10,5]:g = (add(n,i) for i in g)
# 到最后往里面放數據就對了 print(list(g)) # [15,16,17,18]
print(list(g)) # []
yield:相當于return,可以返回數據,但是yield不會徹底中斷函數,分段執行函數 def order():for i in range(100000):yield '衣服'+ str(i) g = order() # 獲取生成器 mingwei = g.__next__() print(mingwei) zhaoyinning = g.__next__() print(zhaoyinning)
?send() 和 __next__()的區別:
1.send和next都是讓生成器向下走一次
2.send可以給上一個yield的位置傳遞值,不能給最后一個yield發送值,在第一次執行生成器代碼的時候不能使用send()
def eat():print("我吃什么啊")a = yield "饅頭"print("a=",a)b = yield "大餅"print("b=",b)c = yield "韭菜盒子"print("c=",c)yield "GAME OVER" gen = eat() # 獲取生成器 ret1 = gen.__next__() print(ret1) # 饅頭 ret2 = gen.send("胡辣湯") # a = 胡辣湯 print(ret2) # 大餅 ret3 = gen.send("狗糧") # b = 狗糧 print(ret3) # 韭菜盒子 ret4 = gen.send("貓糧") # c = 貓糧 print(ret4) # GAME OVER?
推導式:用一句話生成一個列表
lst = ['python'+str(i) for i in range(1,16)] print(lst)語法:[ 結果? for循環? 判斷]
lst = [i for i in range(100) if i%2 == 1] print(lst) # 100 以內能被3整除的數的平方 lst = [i*i for i in range(100) if i%3==0] print(lst) # 尋找名字中帶有兩個e的人的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # 不用推導式的方法 lst = [] for line in names:for name in line:if name.count('e') == 2:lst.append(name) print(lst)#推導式的方法 lst = [name for line in names for name in line if name.count('e') == 2] print(lst)字典推導式
語法:{k:v for循環 條件篩選}
#[11,22,33,44] => {0:11,1:22,2:33,3:44} lst = [11,22,33,44] dic = {i:lst[i] for i in range(len(lst))} print(dic) # 鍵值對互換 dic = {'jj':'林俊杰','jay':'周杰倫','zs':'趙四','ln':'劉能'} dic2 = {v:k for k,v in dic.items()} print(dic2)集合推導式(可以去重復)
lst = [1,1,4,6,7,4,2,2]
s = {el for el in lst}
print(s)
?
生成器表達式(由于惰性機制)
tu = (i for i in range(10)) # 沒有元組推導式,生成器表達式 print(tu) # 生成器 print(tu.__next__()) def func():print(111)yield 222 g = func() g1 = (i for i in g) g2 = (i for i in g1)print(list(g)) # [222] 源頭,從源頭把數據拿走了 print(list(g1)) # [] 這里執行的時候,源頭已經沒有數據了 print(list(g2)) # [] 這里也沒有值 def add(a,b):return a + b# 生成器函數 # 0-3 def test():for j in range(4):yield j
# 0,1,2,3 g = test() # 獲取生成器
# 懶 for n in [1,10,5]:g = (add(n,i) for i in g)
# 到最后往里面放數據就對了 print(list(g)) # [15,16,17,18]
print(list(g)) # []
?
轉載于:https://www.cnblogs.com/Little-Raccoon/p/10834696.html
總結
- 上一篇: GoogLeNet结构
- 下一篇: 搭建ELK-流水账-只记思路