pythons 在 go 中枚举
pythons enumerate in go
假设我有斐波那契数的生成器,我想使用 enumerate(get_next_fibs(10))
并且我想有对 index, number_from_generator
的生成器,我正在努力寻找“命名”的解决方案return 值
这不是应该怎么做,而是为了学习有关生成器的具体知识
package main
import "fmt"
func get_next_fibs(ii int) func() int {
i := 0
a, b := 0, 1
fc := func() int {
i++
a, b = b, a+b
if ii <= i {
return -1
}
return a
}
return fc
}
func enumerate(iter func() int) func() (index, v int) {
index := 0
fc := func() (index, v int) {
v := iter()
return
index++
}
return fc
}
func main() {
iter := enumerate(get_next_fibs(10))
// iter := get_next_fibs(10)
fmt.Printf("iter = %T\n", iter)
for tuple := iter(); tuple != -1; tuple = iter() {
fmt.Println("tuple:", tuple)
}
}
您在此代码示例中几乎没有问题:
- return 语句后不能有
index++
。 Use defer
如果你需要在 return
-ing 之后做点什么。
- 您不知道变量阴影在 go 中是如何工作的。因此,您正在尝试修改错误的
index
变量。
- Go 没有元组。
...
func enumerate(iter func() int) func() (index, v int) {
counter := 0
return func() (index, v int) {
i := counter
counter++
return i, iter()
}
}
...
func main() {
iter := enumerate(get_next_fibs(10))
fmt.Printf("iter = %T\n", iter)
for i, v := iter(); v != -1; i, v = iter() {
fmt.Printf("i: %d, v: %d\n", i, v)
}
}
假设我有斐波那契数的生成器,我想使用 enumerate(get_next_fibs(10))
并且我想有对 index, number_from_generator
的生成器,我正在努力寻找“命名”的解决方案return 值
这不是应该怎么做,而是为了学习有关生成器的具体知识
package main
import "fmt"
func get_next_fibs(ii int) func() int {
i := 0
a, b := 0, 1
fc := func() int {
i++
a, b = b, a+b
if ii <= i {
return -1
}
return a
}
return fc
}
func enumerate(iter func() int) func() (index, v int) {
index := 0
fc := func() (index, v int) {
v := iter()
return
index++
}
return fc
}
func main() {
iter := enumerate(get_next_fibs(10))
// iter := get_next_fibs(10)
fmt.Printf("iter = %T\n", iter)
for tuple := iter(); tuple != -1; tuple = iter() {
fmt.Println("tuple:", tuple)
}
}
您在此代码示例中几乎没有问题:
- return 语句后不能有
index++
。 Usedefer
如果你需要在return
-ing 之后做点什么。 - 您不知道变量阴影在 go 中是如何工作的。因此,您正在尝试修改错误的
index
变量。 - Go 没有元组。
...
func enumerate(iter func() int) func() (index, v int) {
counter := 0
return func() (index, v int) {
i := counter
counter++
return i, iter()
}
}
...
func main() {
iter := enumerate(get_next_fibs(10))
fmt.Printf("iter = %T\n", iter)
for i, v := iter(); v != -1; i, v = iter() {
fmt.Printf("i: %d, v: %d\n", i, v)
}
}