在Python編程語(yǔ)言中,生成器無(wú)疑是最有用的特性之一,但同時(shí),生成器也是Python中使用最少的特性之一。為什么它們?nèi)绱擞杏?,但沒(méi)有被很多人使用呢?原因是生成器的概念在其他編程語(yǔ)言中比較少見(jiàn),也就是對(duì)大多數(shù)人來(lái)說(shuō)是一個(gè)比較新的東西,所以沒(méi)有引起廣大程序員的注意。
什么是生成器?
這個(gè)概念比較模糊,每個(gè)人都有自己不同的理解,但是大部分主體是一樣的,本質(zhì)都是迭代器,但是很多時(shí)候迭代器和生成器被認(rèn)為是同一個(gè)概念,其實(shí)兩者也有.唯一不同的是,迭代器是Python提供給開(kāi)發(fā)者已經(jīng)編寫(xiě)好的工具或者是通過(guò)數(shù)據(jù)轉(zhuǎn)換得到的工具。生成器是一個(gè)需要開(kāi)發(fā)者自己用Python代碼構(gòu)建的工具,這是最大的不同。
Python中創(chuàng)建生成器有三種方式,如何創(chuàng)建呢?
1.通過(guò)生成器函數(shù)
2.通過(guò)生成器推導(dǎo)公式
3.提供Python內(nèi)置函數(shù)或模塊,其實(shí)1和3這兩種類(lèi)型本質(zhì)上是一樣的。它們都是以函數(shù)的形式生成的,只不過(guò)1是我自己寫(xiě)的生成器函數(shù),3是Python提供的生成器函數(shù)。
生成器的優(yōu)點(diǎn)是可以邊循環(huán)邊計(jì)算,不用單遍就可以生成大集合。生成器可以節(jié)省內(nèi)存空間。
生成器保存的是算法,列表保存計(jì)算出的內(nèi)容,所以對(duì)于相同的內(nèi)容,生成器占用內(nèi)存小,而列表占用內(nèi)存大。
在Python中,使用yield的函數(shù)可以稱(chēng)為生成器,生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作。簡(jiǎn)單來(lái)說(shuō),可以理解為生成器=迭代器。