Función for (python), duda de "novato".

Iniciado por assw1208, 25 Julio 2020, 19:13 PM

0 Miembros y 1 Visitante están viendo este tema.

assw1208

Aunque llevo cierto tiempo usando python siempre he sido un poco reacio a usar la función for. Ahora siguiendo un curso online he tenido una duda y no encuentro ningún sitio donde se explique "bien" el porque de mi duda. En fin este es el codigo:

#Modificar una lista.
lista = [1,2,3,4,5,6,7,8,9]
Indice = 0
for recorrer in lista:
    lista[Indice] *= 10
    Indice += 1
print(lista)

Se que no es el código más largo ni espectacular pero: ¿Por qué si Indice = 0 todo va bien, pero si Indice = 1, la maquina me devuelve: "lista[Indice] *= 10
IndexError= list idex out of range "?
Y otra duda aparte: ¿Por qué es necesario el Indice en "lista[Indice] *= 10"? Se que si lo quitas el programa realmente imprime la lista 10 veces, pero sigo sin entender porque es necesario.
En fin se que no me explico muy bien, pero espero que alguien pueda ayudarme.
Gracias por todo de antemano ;-) ;-).
"COURAGE TODAY,
                              VICTORY TOMORROW "

                            ----------------W--------------

EdePC

Citar¿Por qué si Indice = 0 todo va bien, pero si Indice = 1, la maquina me devuelve: "lista[Indice] *= 10
IndexError= list idex out of range "?

Porque el For se itera 9 veces (uno por cada elemento de la lista), así que el índice debe ir desde 0 hasta 8, si pones 1 u otro valor esto hará que este índice llegue a por ejemplo 9 y este índice no existe en la lista (no confundir índice con valor)

CitarY otra duda aparte: ¿Por qué es necesario el Indice en "lista[Indice] *= 10"

Primero tienes que entender para que sirve y que hace tu Script (código), en tu caso sirve para mostrar una lista que va del 10 al 90, y lo hace iterando sobre los elementos indexados de una lista pre-existente que va del 1 al 9, esto lo logra reemplazando el valor que ya existe multiplicándolo por 10 y poniendo este resultado en su lugar

Drakaris

Citar
¿Por qué si Indice = 0 todo va bien, pero si Indice = 1, la maquina me devuelve: "lista[Indice] *= 10
IndexError= list idex out of range "?
Porque al final de la lista, el la variable indice tendrá un numero mayor del indice existente.

para mostrar un elemento en la lista sería lo siguiente.

lista = [1,2,3,4,5,6,7,8,9]
lista[0] => output: 1
lista[1] => output: 2
lista[2] => output: 3
lista[3] => output: 4
lista[4] => output: 5
lista[5] => output: 6
lista[6] => output: 7
lista[7] => output: 8
lista[8] => output: 9
lista[9] => IndexError= list idex out of range

Ya que en la posición 9 ya no hay ningun elemento

SI la lista fuera:

lista = [1,2,3,4,5,6,7,8,9,10]
lista[0] => output: 1
lista[1] => output: 2
lista[2] => output: 3
lista[3] => output: 4
lista[4] => output: 5
lista[5] => output: 6
lista[6] => output: 7
lista[7] => output: 8
lista[8] => output: 9
lista[9] => 10

La posicion 9 tendría el valor 10, si ahora en esta lista pones un numero mayor este te saltará el error IndexError= list idex out of range

Esto lo tienes claro? Una vez entiendes esto... veamos tu codigo


#Modificar una lista.
lista = [1,2,3,4,5,6,7,8,9]
Indice = 0
for recorrer in lista:
   lista[Indice] *= 10
   Indice += 1
print(lista)


Este crea una lista y en la variable Indice el valor por defecto es 0. Después leemos todos los elementos de la lista con un bucle for

for recorrer in lista:
   lista[Indice] *= 10
   Indice += 1

El bucle para cada elemento ejecutará lo que haya dentro. así que:


   1º pasada:
          lista[0] *=10 # output 10
   2º pasada:
          lista[1] *=10 # output 20
   3º pasada:
          lista[2] *=10 # output 30
   ....
   9º pasada:
         lista[8] *=10 # output 90 (9*10)


Ahora pongamos la variable Indice como valor 1 por defecto

   1º pasada:
          lista[1] *=10 # output 20
   2º pasada:
          lista[2] *=10 # output 30
   3º pasada:
          lista[3] *=10 # output 40
   ....
   9º pasada:
         lista[9] *=10 # output ERROR IndexError= list idex out of range

Y como da un error, ya no puede acabar de ejecutar el script

Citar
¿Por qué es necesario el Indice en "lista[Indice] *= 10"?
Porque si no, no estas especificando ningún número para que pueda ejecutar la operacion.

Espero que te haya podido resolver tu duda!  :). Y suerte con tus estudios.
Lo increible, no es lo que ves, sino como es

tincopasan

#3
más allá de todo lo que te explicaron, no es necesario usar ese indice si se puede de otra forma provista por el lenguaje:
Código (python) [Seleccionar]

lista = [1,2,3,4,5,6,7,8,9]
for recorrer in range(len(lista)):
  lista[recorrer] *= 10
print(lista)


y listo!

Edito: más adelante lo harás simplemente así:

Código (python) [Seleccionar]
lista = [1,2,3,4,5,6,7,8,9]
lista = [lista[valor] * 10 for valor in range(len(lista))]
print(lista)


y como dije la variable indice es innecesaria

Saludos

assw1208

Cita de: EdePC en 25 Julio 2020, 19:50 PM
Porque el For se itera 9 veces (uno por cada elemento de la lista), así que el índice debe ir desde 0 hasta 8, si pones 1 u otro valor esto hará que este índice llegue a por ejemplo 9 y este índice no existe en la lista (no confundir índice con valor)

Primero tienes que entender para que sirve y que hace tu Script (código), en tu caso sirve para mostrar una lista que va del 10 al 90, y lo hace iterando sobre los elementos indexados de una lista pre-existente que va del 1 al 9, esto lo logra reemplazando el valor que ya existe multiplicándolo por 10 y poniendo este resultado en su lugar

Muchas gracias por la explicación, ahora empiezo a entender esto ;-).
"COURAGE TODAY,
                              VICTORY TOMORROW "

                            ----------------W--------------

assw1208

Cita de: Drakaris en 25 Julio 2020, 19:54 PM
Porque al final de la lista, el la variable indice tendrá un numero mayor del indice existente.

para mostrar un elemento en la lista sería lo siguiente.

lista = [1,2,3,4,5,6,7,8,9]
lista[0] => output: 1
lista[1] => output: 2
lista[2] => output: 3
lista[3] => output: 4
lista[4] => output: 5
lista[5] => output: 6
lista[6] => output: 7
lista[7] => output: 8
lista[8] => output: 9
lista[9] => IndexError= list idex out of range

Ya que en la posición 9 ya no hay ningun elemento

SI la lista fuera:

lista = [1,2,3,4,5,6,7,8,9,10]
lista[0] => output: 1
lista[1] => output: 2
lista[2] => output: 3
lista[3] => output: 4
lista[4] => output: 5
lista[5] => output: 6
lista[6] => output: 7
lista[7] => output: 8
lista[8] => output: 9
lista[9] => 10

La posicion 9 tendría el valor 10, si ahora en esta lista pones un numero mayor este te saltará el error IndexError= list idex out of range

Esto lo tienes claro? Una vez entiendes esto... veamos tu codigo


#Modificar una lista.
lista = [1,2,3,4,5,6,7,8,9]
Indice = 0
for recorrer in lista:
   lista[Indice] *= 10
   Indice += 1
print(lista)


Este crea una lista y en la variable Indice el valor por defecto es 0. Después leemos todos los elementos de la lista con un bucle for

for recorrer in lista:
   lista[Indice] *= 10
   Indice += 1

El bucle para cada elemento ejecutará lo que haya dentro. así que:


   1º pasada:
          lista[0] *=10 # output 10
   2º pasada:
          lista[1] *=10 # output 20
   3º pasada:
          lista[2] *=10 # output 30
   ....
   9º pasada:
         lista[8] *=10 # output 90 (9*10)


Ahora pongamos la variable Indice como valor 1 por defecto

   1º pasada:
          lista[1] *=10 # output 20
   2º pasada:
          lista[2] *=10 # output 30
   3º pasada:
          lista[3] *=10 # output 40
   ....
   9º pasada:
         lista[9] *=10 # output ERROR IndexError= list idex out of range

Y como da un error, ya no puede acabar de ejecutar el script
Porque si no, no estas especificando ningún número para que pueda ejecutar la operacion.

Espero que te haya podido resolver tu duda!  :). Y suerte con tus estudios.

Muchas gracias por la explicación no me esperaba algo así tan detallado :o :o.
"COURAGE TODAY,
                              VICTORY TOMORROW "

                            ----------------W--------------

assw1208

Cita de: tincopasan en 25 Julio 2020, 21:42 PM
más allá de todo lo que te explicaron, no es necesario usar ese indice si se puede de otra forma provista por el lenguaje:
Código (python) [Seleccionar]

lista = [1,2,3,4,5,6,7,8,9]
for recorrer in range(len(lista)):
  lista[recorrer] *= 10
print(lista)


y listo!

Edito: más adelante lo harás simplemente así:

Código (python) [Seleccionar]
lista = [1,2,3,4,5,6,7,8,9]
lista = [lista[valor] * 10 for valor in range(len(lista))]
print(lista)


y como dije la variable indice es innecesaria

Saludos

Woow vaya locura de acortación de código, lo intentare poner en practica.
"COURAGE TODAY,
                              VICTORY TOMORROW "

                            ----------------W--------------