es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función “enumerate” de Python en Go.

Digamos que tengo un generador de números de Fibonacci, y me gustaría usar enumerate(get_next_fibs(10)) y quisiera tener un generador de pares índice, número_del_generador, estoy luchando por encontrar una solución con “valores de retorno nombrados”.

Y no es la forma en que se debe hacer, pero es para aprender cosas específicas sobre los generadores.


paquete principal importar "fmt" func get_next_fibs(ii int) func() int { i := 0 a, b := 0, 1 fc := func() int { i++ a, b = b, a+b si ii <= i { return -1 } volver a } volver fc } func enumerate(iter func() int) func() (índice, v int) { índice := 0 fc := func() (índice, v int) { v := iter() return índice ++ } volver fc } func main() { iter := enumerate(get_next_fibs(10)) // iter := get_next_fibs(10) fmt.Printf("iter = %T\n", iter) para la tupla := iter(); tupla != -1; tupla = iter() { fmt.Println("tuple:", tupla) } }
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para crear un generador de pares índice, número_del_generador mientras se usa enumerate(get_next_fibs(10)), la función enumerate() debe modificarse para devolver un closure que devuelva tanto el índice como el valor del generador de entrada.

    Aquí está el código modificado:

    func enumerate(iter func() int) func() (index, v int) {
        index := 0
        fc := func() (int, int) {
            v := iter()
            if v == -1 {
                return -1, -1
            }
            index++
            return index - 1, v
        }
        return fc
    }
    

    Los cambios realizados en la función enumerate() son los siguientes:

    • El closure devuelto ahora devuelve tanto el índice como el valor del generador de entrada.
    • Dentro del cierre, se verifica si el valor del generador de entrada ha llegado al final (-1), en cuyo caso tanto el índice como el valor devuelto son -1.
    • El contador de índices se incrementa antes de devolver el valor del índice.

    Con la función enumerate() modificada, se puede usar el siguiente código para generar los pares de índice y números de Fibonacci:

    iter := enumerate(get_next_fibs(10))
    for idx, fib := iter(); idx != -1 && fib != -1; idx, fib = iter() {
        fmt.Println("tuple:", idx, fib)
    }
    

    Resultado:

    tuple: 0 1
    tuple: 1 1
    tuple: 2 2
    tuple: 3 3
    tuple: 4 5
    tuple: 5 8
    tuple: 6 13
    tuple: 7 21
    tuple: 8 34
    tuple: 9 55
    

Comments are closed.