兩道生成器面試題

何時使用生成器呢,當你不想一次性把全部值都列出來,要一個個調用的時候。面試

 

# yield執行的模式
def gen():
    print('start')
    m = yield 2  # 能夠看做yield返回值爲2,send(3)把3傳遞給m,並調用,m變成3了,同下
    print(m)
    n = yield 3
    print(n)
# try:
#     g = gen()
#     print(g.__next__())
#     print(g.send('m 是多少呢'))
# except StopIteration:
#     pass
try:
    g = gen()     #此時不運行gen()函數,若print(g) 會打印該生成器的內存地址
    print(g.send(None))  #至關於 g.__next__(),執行了這一步,首先打印了 start,接着打印 yield返回值 2,而後函數暫停
    print(g.send(6666))
    print(g.send(3333))
except StopIteration as e:
    print(e.value)

# yield獲取移動平均值
def avr(num):
    count = 0
    for i in range(num):
        count +=i
        if i:
            arg = count/(i+1)
            yield arg
ret = avr(5)
for i in ret:
    print(i)
print(ret)

#獲取移動平均值 真
def average():
    sum,avg,count = 0,0,0
    while True:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

avg_g = average()
print(avg_g.__next__())
print(avg_g.send(10))
print(avg_g.send(20))
生成器補充理解

 

 

 

兩道面試題:ide

之後但凡碰到for循環套生成器,就拆開來作,好比後一題函數

 1 # def demo():
 2 #     for i in range(4):
 3 #         yield i
 4 #
 5 # g=demo()
 6 #            #生成式表達式
 7 # g1=(i for i in g) #g1也是個生成器,可是直到調用list(g1)才運行g1裏的語句,而後把調用到g的值,悉數給了list,此時g1做爲生成器,取到頭了,沒值了
 8 # g2=(i for i in g1)            #當list(g2)向g1要值得時候,g1沒東西給它
 9 #
10 # print(list(g1))  #[0,1,2,3]
11 # print(list(g2))
12 >>
[0, 1, 2, 3]
[]

  






13 def add(n,i): 14 return n+i 15 16 def test(): 17 for i in range(4): 18 yield i 19 20 g=test() 21 for n in [1,10]: 22 g=(add(n,i) for i in g) #先執行 for i in g ,再執行 add函數 23 24 print(list(g)) 25
>>>[20, 21, 22, 23]


26 # for n in [1,10]: 27 # g=(add(n,i) for i in g) #先執行 for i in g ,再執行 add函數 28 # 能夠當作是: 29 # n = 1: 執行g=(add(n,i) for i in g) 30 # n = 10:執行g=(add(n,i) for i in g) 31 # 可是g做爲生成式表達式,只是一個內存地址,調用不到 32 # 因此此時 n = 10,而後繼續往下執行 print(list(g)) 33 # 此時開始調用g,可是執行的是 n = 10:執行g=(add(n,i) for i in g) 同時括號裏的g 應該替換爲 當 n=1的時候,執行的g 34 # 也就是 此時執行的是 n = 10: g=(add(10,i) for i in g=(add(10,i) for i in g)) 35 #注意此處 n的變化 36 #而後就變爲了 g=(add(10,i) for i in (10,11,12,13)) 37 #最後結果爲 [20,21,22,23] 38 39 #若是換成 40 #for n in [1,10,5]: 41 # g=(add(n,i) for i in g) 42 #能夠當作: 43 # n = 1: 執行g=(add(n,i) for i in test()) #(0,1,2,3) 44 # n = 10:執行g=(add(n,i) for i in (add(n,i) for i in test())) ) (5,6,7,8) 45 # n = 5:執行g=(add(5,i) for i in (add(n,i) for i in (add(n,i) for i in test())) )) 46 # (10,11,12,13) (5,6,7,8) #(0,1,2,3)>>>>[15,16,17,18]
相關文章
相關標籤/搜索