1. 程式人生 > >生成器和生成器表達式

生成器和生成器表達式

使用 __next__ app 下一個 pre 列表推導 list func 難度

什麽是生成器?

def func():
    print("含有yield的是生成器")
    yield 10#返回值
ret=func()#函數並不執行  而是記錄代碼
print(ret)#當使用到函數時 開始執行 獲取到的是生成器
#生成器和叠代器類似,可以使用__next__來獲取到下一個值

例如

def func():
    print("111")
    yield 222
gen=func()
ret=gen.__next__()
print(ret)

》》》111
222

列表推導式

取1-100的奇數

lst=[i for i in range(1,101) if
i%2==1] print(lst)

對比之前的想法

lst=[]
for i in range(1,101):
    if i %2==1:
        lst.append(i)
print(lst)

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

字典推導式

lst1=["東北","山西","山東"]
lst2=["大亂燉","老陳醋","大餅"]
dic={lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)

一個面試題. 難度系數500000000顆星:

def add(a, b):
    return a + b
def test():
    for r_i in range(4):
      yield r_i
g = test()
for n in [2, 10]:
    g = (add(n, i) for i in g)
print(list(g))

推導過程思路主要利用生成器的特性 不調用或者執行的時候不會給值

def add(a, b):#a+b
    return a + b
def test():#0-3
    for r_i in range(4):
        yield r_i
g = test()#函數不執行,獲取到的是生成器
for n in [2, 10]:#這個循環獲取到列表中的兩個值,(巨坑開始)
    g = (add(n, i) for i in g)
print(list(g))

把for循環拆開分析

n=2
g = (add(n, i) for i in g)#註意  這裏並不執行代碼  而是記錄代碼
n=10
g = (add(n, i) for i in g)#這裏的第二個g,已經替換成n=2時的g = (add(n, i) for i in g)

n=2
g = (add(n, i) for i in g)#註意  這裏並不執行代碼  而是記錄代碼
n=10
g = (add(n, i) for i in (add(n, i) for i in g))#這裏的第二個g,已經替換成n=2時的g = (add(n, i) for i in g)

def add(a, b):#a+b
    return a + b
def test():#0-3
    for r_i in range(4):
        yield r_i
g = test()#函數不執行,獲取到的是生成器
n=10
g = (add(n, i) for i in (add(n, i) for i in g))
print(list(g))#函數開始執行

》》》[20, 21, 22, 23]

友情提示: 惰性機制, 不到最後不會拿值
這個題要先讀一下. 然後自己分析出結果. 最後用機器跑一下.

生成器和生成器表達式