程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【周周Python百日刷題計劃】Day2~生成器面試題(你真的了解Python生成器嗎?)

編輯:Python

目錄

前言:

🦠​​​​​面試題一(難度為中等偏上且必須掌握)

️️題目要求

️️題目提示

️️流程圖分析

️​​​​​​​️答案以及解析

運行結果

解析

拓展思考

🦠面試題二(難度為難且必須掌握)

️​​​​​​​️題目要求

️​​​​​​​️題目提示

️​​​​​​​️答案以及解析

運行結果

解析

🦠面試題三進階版

️​​​​​​​️題目要求

️​​​​​​​️答案以及解析

運行結果

解析

結語:


前言:

本篇博客主要向各位小伙伴們介紹的<Python生成器面試題>,帶各位掌握Python希望各位小伙伴們能夠在這裡收獲到更多知識!讓我們一起學習!一起進步!

作者希望:由於博主水平限制,博客難免會有錯誤和不准之處,我也非常希望各位小伙伴能夠在留言區指出。讓我們一起共勉。

🦠​​​​​​​​​​​​面試題一(難度為中等偏上且必須掌握)

️​​​​​​​️題目要求

以下代碼執行後的輸出結果是什麼?

def func():
for i in range(4):
yield i
g=func()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))
print(list(g2))

️​​​​​​​️題目提示

1、同一個生成器中的數據只能取一次,取完就沒有了

2、生成器的特點惰性運算:不找生成器取值,它就根本不工作

️​​​​​​​️流程圖分析

️​​​​​​​️答案以及解析

運行結果

解析

1、先定義了三個生成器g、g1、g2

g=func()
g1=(i for i in g)
g2=(i for i in g1)

2、因為遇到了list(g1),所以list要向g1要值,由於g1 = (i for i in g),所以g1又向g要值然後g執行依次返回0,1,2,3給g1,g1又依次返回給list,所以最後打印出了[0,1,2,3]

下一步執行list(g2)所以g2要向g1要值。因為g1的值在list(g1)的時候都給了list,所以g1裡面已經沒有值了,所以g1更不會向g取值,所以list(g2)打印出的只是一個空列表

拓展思考

如果將print(list(g1))注釋掉打印出的結果是什麼:

因為沒有list(g1)向g1要值,所以g是不為空的,所以list(g2)打印的結果是[0,1,2,3]

🦠面試題二(難度為難且必須掌握)

️​​​​​​​️題目要求

下列代碼執行後的輸出結果是什麼:

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

️​​​​​​​️題目提示

將代碼中的

for n in [1,10]:
g=(add(n,i) for i in g)

用以下代碼替換之後在思考一下

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in g)

 ️​​​​​​​️答案以及解析

運行結果

解析

將提示中的代碼進一步替換

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in g)

替換為以下代碼:

n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in (add(n,i) for i in test()))

題目就可以替換為

def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
n = 1
g = (add(n,i) for i in g)
#當執行n=10後n=1就徹底消失了,就不用管了
n = 10
g = (add(n,i) for i in (add(n,i) for i in test()))
#也可以進一步換為g = (add(10,i) for i in (add(10,i) for i in test()))
print(list(g))

所以代碼運行結果為:[20, 21, 22, 23]就顯而易見了

如果面試題三已經明白了,那就做一下面這個進階版的面試題三吧(如果還沒懂的話額…那就多看幾遍吧相信一定會看懂​​​​​​​)

🦠面試題三進階版

️​​​​​​​️題目要求

下列代碼執行後的輸出結果是什麼?

def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
for n in [1,10,5]:
g=(add(n,i) for i in g)
print(list(g))

️​​​​​​​️答案以及解析

運行結果

解析

可以將代碼等價為如下代碼

def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
#for n in [1,10,5]:
# g=(add(n,i) for i in g)
n = 1
g=(add(n,i) for i in g) #g=(add(n,i) for i in test())
n = 10
g=(add(n,i) for i in g) #g=(add(n,i) for i in (add(n,i) for i in test()))
n = 5
g=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in test())))
print(list(g))

相信通過上面的代碼你就可以更好的了解題目,和答案的產生了到此本次分享就結束了

結語:

感謝各位能夠看到這裡:

最後一句:代碼看懂了不是懂,一定要自己實際操作哇,這樣才能更好的理解和吸收。
最後來一句:一個人可以在任何他懷有無限熱忱的事情上成功,讓我們一起進步吧!!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved