Go基礎系列 惰性數值生成器

2022-02-20 09:29:06 字數 1285 閱讀 9470

惰性數值生成器是指在需要的時候才生成下乙個數值,不需要的時候就卡在那。這和python的列表推導表示式類似。惰性生成器的好處是不會一次性將全部結果返回或放進記憶體,而是每次只返回乙個,這樣不會在某一時刻大量占用記憶體和其它資源。

比如,要生成10w個數值,如果要迭代這10w個數值,有兩種方法。第一種方法是將10w個數值全部生成好放進乙個陣列(或其它資料結構),然後再去陣列中取資料。第二種方法是迭代到哪個數值的時候臨時去生成這個數值。它們的區別是顯然的:第一種方法會占用大量記憶體,且速度有可能會很慢,第二種方法每次只占用乙個數值的記憶體空間,用完就丟了。

下面是乙個不算完美的惰性數值生成器示例:

package main

import (

"fmt"

)func generatenums(nums chan int)

}()}func getnums(nums chan int) int

func main()

}

其中generatenums()函式是惰性數值生成器,它使用乙個nums channel作為引數,每次生成的數值都會放進這個channel中。

getnums()函式是取出存入nums channel中的數並返回。

理論上一切都很簡單,只要在需要的地方呼叫generatenums()函式即可。但問題在於如果多個地方呼叫generatenums(),各個地方的nums通道將互相影響。所以,應該改進一下,讓generatenums()自帶屬於自己的nums通道,而不是多個generatenums()共享乙個nums通道。

func generatenums(nums chan int) {}

|\|/

func generatenums()

因為通道私有了,要想從這個通道中取資料,需要將這個通道作為返回值:

func generatenums() chan int
這樣每次呼叫generatenums()就取得了它的數值生成器通道:

nums := generatenums()
下面是改良後的惰性數值生成器:

package main

import (

"fmt"

)func generatenums() chan int

}()return nums

}func getnums(nums chan int) int

func main()

}

python基礎 生成器

生成器是根據某種演算法得出的一系列元素,需要用到該元素,才會生成出來,比列表節省記憶體空間。生成器相當於儲存演算法,授人以漁,列表之類的是授人以魚。第一種建立生成器的方法 1 gen x 2 for x in range 5 type gen 通過next 函式得到生成器的每個值 next gen ...

python基礎 生成器

生成器函式 def generator print 1 return a ret generator print ret 只要含有yield關鍵字的函式都是生成器函式 yield不能和return共用且需要寫在函式內 def generator print 1 yield a 生成器函式 執行之後會...

Generator生成器基礎

生成器函式是es6提供的一種非同步程式設計解決方案,語法行為與傳統函式完全不同 function gen let iterator gen console.log iterator 不會輸出hello 是乙個迭代器物件 需要呼叫next方法才會輸出 iterator.next 輸出結果 yield相...