1. 經過⽣成器函數2. 經過各類推導式來實現⽣成器3. 經過數據的轉換也能夠獲取⽣成器
def func(): print("111") return 222 ret = func() print(ret)
結果: 111 222
def func(): print("111") yield 222 ret = func() print(ret)
結果: <generator object func at 0x10567ff68>
def func(): print("111") yield 222 gener = func() # 這個時候函數不會執⾏. ⽽是獲取到⽣成器 ret = gener.__next__() # 這個時候函數纔會執⾏. yield的做⽤和return⼀樣. 也是返回數據 print(ret)
結果: 111 222
def func(): print("111") yield 222 print("333") yield 444 gener = func() ret = gener.__next__() print(ret) ret2 = gener.__next__() print(ret2) ret3 = gener.__next__() # 最後⼀個yield執⾏完畢. 再次__next__()程序報錯, 也就是說. 和return⽆關了. print(ret3)
結果: 111 Traceback (most recent call last): 222 333 File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 55, in <module> 444 ret3 = gener.__next__() # 最後⼀個yield執⾏完畢. 再次__next__()程序報錯, 也就是說. 和return⽆關了. StopIteration
def cloth(): lst = [] for i in range(0, 10000): lst.append("⾐服"+str(i)) return lst cl = cloth()
def cloth(): for i in range(0, 10000): yield "⾐服"+str(i) cl = cloth() print(cl.__next__()) print(cl.__next__()) print(cl.__next__()) print(cl.__next__())
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)
def func(): print(111) yield 222 print(333) yield 444 print(555) yield 666
gen = func() for i in gen: print(i)
結果: 111 222 333 444 555 666
lst = [] for i in range(1, 15): lst.append(i) print(lst)
lst = [i for i in range(1, 15)] print(lst)
[ 結果 for 變量 in 可迭代對象]
lst = ['python%s' % i for i in range(1,15)] print(lst)
[ 結果 for 變量 in 可迭代對象 if 條件 ]
# 獲取1-100內全部的偶數 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>
gen = ("麻花藤我第%s次愛你" % i for i in range(10)) for i in gen: print(i)
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(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']]
# 不⽤推導式和表達式 result = [] for first in names: for name in first: if name.count("e") >= 2: result.append(name) print(result)
# 推導式 gen = (name for first in names for name in first if name.count("e") >= 2) for name in gen: print(name)
1. 列表推導式比較耗內存,⼀次性加載,⽣成器表達式⼏乎不佔⽤內存,使⽤的時候才分配和使⽤內存。2. 獲得的值不⼀樣,列表推導式獲得的是⼀個列表,⽣成器表達式獲取的是⼀個⽣成器。
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同理
# 把字典中的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, 8, -8, 12] # 絕對值去重 s = {abs(i) for i in lst} print(s)
(結果 for 變量 in 可迭代對象 if 條件篩選)