Python Quiz 8 – Asignación múltiple y actualización de índices en Python
Pregunta principal del PyQuiz:
>>> acc, i = 0, 0
>>> values = [1, 2, 3, 4]
>>> for _ in range(3):
... val_i, i = values[i], i + 1
... acc += val_i
>>> print(acc)
- ?? -
# A - RuntimeError
# B - 6
# C - 9
Concepto y explicación
En esta pregunta se quiere hacer hincapié en la asignación múltiple de variables y el orden de ejecución de esa sentencia.
Como se puede ver en el código, la lógica principal de esta pregunta es la siguiente:
- Inicializamos una variable acumulador y una variable indice (acc e i respectivamente).
- Se crea una lista con unos valores.
- Se itera por 3 elementos accediendo al valor de values[i] y actualizando el valor de i en la misma sentencia.
- Se suman los valores accedidos en acc.
- Se imprimen los valores acumulados.
Realmente la ejecución es imperativa y no presenta mayor problema, salvo en saber, simplemente leyendo el código, qué valores se van a sumar y cuales no.
Todas las sentencias son válidas por lo que la ejecución no termina devolviendo un error como se expresa en la solución B, sino que termina con la suma de 3 valores consecutivo de la lista de valores.
Lo importante es determinar cuál es el valor inicial de i cuando se itera, dado que podría ser 0 o 1, y sabiendo ese dato, se puede sumar los siguiente 3 valores.
Vamos a ver las 3 iteraciones con sus valores iniciales y a salir de dudas:
# acc = 0, i = 0 , values = [1, 2, 3, 4]
for _ in range(3):
val_i, i = values[i], i + 1
# val_i = 1, i = 1
acc += val_i
# acc = 1
Habiendo ejecutado la primera iteración se puede ver que primero ocurre el acceso a values[i]
y después se actualiza el valor de i
, por lo tanto el valor final será la suma de los elementos desde el 1 hasta el 3. Pero vamos a comprobarlo:
# acc = 1, i = 1 , values = [1, 2, 3, 4]
for _ in range(3):
val_i, i = values[i], i + 1
# val_i = 2, i = 2
acc += val_i
# acc = 3
# acc = 3, i = 2, values = [1, 2, 3, 4]
for _ in range(3):
val_i, i = values[i], i + 1
# val_i = 3, i = 3
acc += val_i
# acc = 6
Tras la tercera iteración, el bucle for
termina e imprime la variable acc
.
>>> acc
6
Por lo tanto, es muy importante tener en cuenta que aunque haya una asignación múltiple, el orden sigue siendo de izquierda a derecha, por lo que las siguientes sentencias son equivalentes:
val_i, i = values[i], i + 1
# es igual que:
val_i = values[i]
i = i + 1
Solución
Por tanto la solución correcta es la B:
B) 6
Practica Python con PyQuizzes
En la sección de PyQuizzes puedes encontrar ejercicios prácticos explicados pormenorizado para mejorar tus habilidades como pythonista. ¡No te los pierdas!
Tutorial Python online
Aprender Python de forma gratuita siguiendo las secciones del tutorial de Python.
Libros recomendados para aprender Python
Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.