def func(): print("111") return 222 ret = func() print(ret) # 結果 111 222 #將函數中的return換成yield就成了生成器 def func(): print("111") yield 222 ret = func() print(ret) #結果 <generator object func at 0x0000019D9FF3D150>
def func(): print("111") yield 222 ret = func() ret1 = ret.__next__() print(ret1) #111 222
def generator(): print(123) content = yield 1 print('=======',content) print(456) yield2 g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send的效果和next同樣 print('***',ret) #send 獲取下一個值的效果和next基本一致 #只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據 #使用send的注意事項 # 第一次使用生成器的時候 是用next獲取下一個值 # 最後一個yield不能接受外部的值
# 例題: # 一公司訂購10000件衣服,而員工並無這麼多,一次分不完只能堆起來.佔空間 def cloth(): lst = [] for i in range(10000): lst.append("衣服"+ str(i)) return lst cl = cloth() #最好的方法是來一個新員工領一套,不用一次性作那麼多件衣服,用多少取多少. def cloth(): lst = [] for i in range(10000): lst.append("衣服"+ str(i)) yield lst cl = cloth()
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("胡辣湯") print(ret2) ret3 = gen.send("狗糧") print(ret3) ret4 = gen.send("貓糧") print(ret4)
lst = [] for i in range(1,15): lst.append(i) print(lst) #替換成列表推導式 lst = [i for i in range(1,15)] print(lst)
# 把字典中的key和value互換 dic = {'a': 1, 'b': '2'} new_dic = {dic[key]: key for key in dic} print(new_dic) # 在如下list中. 從lst1中獲取的數據和lst2中相對應的位置的數據組成⼀個新字典 lst1 = ['jay', 'jj', 'sylar'] lst2 = ['周杰倫', '林俊杰', '邱彥濤'] dic = {lst1[i]: lst2[i] for i in range(len(lst1))} print(dic)
#集合推導式能夠幫咱們去重 lst = [1,1,2,4,9,6,8,4,2,6] s = {i for i in lst} print(s) #{1, 2, 4, 6, 8, 9}
# 獲取1-100能被3整除的數 gen = (i for i in range(1,100) if i%3 ==0) for num in gen: print(num) # 100之內能被3整除的數的平⽅ gen = (i*i for i in range(1,100) if i%3 == 0) for num in gen: print(num) # 尋找名字中帶有兩個e的⼈的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # #不用推導式和表達式 lst = [] for i in names: for name in i: if name.count("e") >= 2: lst.append(name) print(lst) #推導式 gen = (name for i in names for name in i if name.count("e") >= 2) for name in gen: print(name)
def func(): print(111) yield 222 g = 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同理
def add(a,b): return a + b def test(): for r_i in range(4): #獲取的是 0,1,2,3 print("a") yield r_i g = test() for n in [2,10]: g = (add(n,i) for i in g) print(list(g))