生成器

要?jiǎng)?chuàng)建一個(gè)generator,有很多種方法。第一種方法很簡(jiǎn)單,只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

第二種方法,要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator:

>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>

但是用for循環(huán)調(diào)用generator時(shí),發(fā)現(xiàn)拿不到generator的return語(yǔ)句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯(cuò)誤,返回值包含在StopIterationvalue中:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表,但是受內(nèi)存限制,列表容量肯定是有限的,而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的...
    劉光軍_MVP閱讀 193評(píng)論 0 0
  • 通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元...
    chen_000閱讀 180評(píng)論 0 0
  • 通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元...
    喵在野閱讀 361評(píng)論 0 1
  • 我們可以通過(guò)列表生成式簡(jiǎn)單直接地創(chuàng)建一個(gè)列表,但是受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)...
    PyChina閱讀 2,908評(píng)論 0 3
  • 目的地成都。 沿途行駛管中窺豹:在成渝環(huán)線上就感覺(jué)到大成都磅礴的氣勢(shì),四通八達(dá)的大環(huán)線把成都與重慶緊密聯(lián)系在一起,...
    山水依情閱讀 842評(píng)論 0 1

友情鏈接更多精彩內(nèi)容