Python之何爲yield關鍵字(生成器)?

yield 關鍵字

yield顧名思義,它是python3中33個關鍵字中的一個,也是非常重要的一個關鍵字。

yield與生成器息息相關,yield <==> 生成器

所以知道了什麼是生成器,yield也自然而然地懂了。
那什麼是生成器呢?

1.生成器是一個不斷產生值的函數。
2.包含yield語句的函數是一個生成器。
3.生成器每次產生一個值(yield語句),函數被凍結,知道再被喚醒後再產生一個值。(也就是說,產生一個值後會在這個位置暫停,直到再被喚醒後,會從暫停的位置開始繼續執行)

接下來我麼來看一段代碼:看看生成器的寫法

#產生所有小於n的平方值
def gen(n):
    for i in range(n):
        yield i**2

按照定義,首先會執行for循環,然後執行到yield語句時,這個函數會被凍結,而當前yield對應的那一行產生的值會被返回出來,通過調用該函數,會逐漸的遍歷這個循環。

生成器的使用一般與循環搭配在一起,我們可以用一個for循環來調用上邊的函數代碼,代碼如下:

def gen(n):
    for i in range(n):
        yield i**2
for i in gen(5):
    print(i,end=" ")
輸出:
0 1 4 9 16 

for循環通過遍歷gen()函數,每次是的會喚醒一次這個函數,因此最後執行出小於5的整數所有的平方值。

事實上它也可以用一般寫法,return生成,代碼如下:

def square(n):
    ls = [i**2 for i in range(n)]
    return ls
for i in square(5):
    print(i,end=" ")
輸出:
0 1 4 9 16 

但是這種普通的寫法與生成器的寫法是有不同的。
這種普通的寫法,是指我們將所有可能得值全部計算出來並且通過一個列表返回給上乘的調用函數。
因此,我們知道,生成器相比這種普通的生成所有內容的寫法它們是不同的。
那生成器有什麼優勢嗎?
其實是非常明顯的!
生成器相比一次列出所有內容的優勢有三個:

1、更節省存儲空間。

2、相應更迅速

3、使用更靈活

我們可以再通過上面的列子進行說明:
普通寫法是一次性將所有可能的值存儲起來並且通過列表返回,
而生成器呢,是每次只返回一個值。
如果上面的例子中,n不是5,而是n=1M、10M、100M或更大呢?(M爲兆)
當n=1M時,
普通寫法需要將所有的值全部列出來並且存儲在列表中再返回,也就是說你必須得等待它將值完全列出來後才能看到結果,這裏還只是1M,那如果是10M,100M,甚至是100000000000M呢,我相信結果還沒出來,你就先沒了。。。。而且它還需要能裝得下它的存儲空間才行。。。
反過來我們通過生成器呢,它在每調用一次的時候只產生一個值並返回,當它再次被調用時也就是喚醒它,它纔會第二個值,以此類推。
所以即使n=10M或更多,對於生成器來說,它需要使用的存儲空間仍然是一個元素的存儲空間,而且不需要等待所有的值都結算完才能看到,可以逐個看,你需要的時候喚醒它,不需要的時候就不喚醒它。

說到這,我相信大家已經對yield有了很清楚的認識了

上一篇文章———>Java 完數 Mooc

下一篇文章———>Pycharm自定義更換背景圖,來給代碼加個PS~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章