En el desarrollo de cualquier sistema es muy común tratar con listas, como una lista de productos, por ejemplo. Supongamos que tenemos la siguiente representación de un producto:
clase Producto (objeto): def __init __ (self, nombre, valor):
self .__ nombre = nombre
auto .__ valor = valor
def __repr __ (self):
return "nombre:% s valor:% s"% (self .__ nombre, self .__ valor)
def get_nombre (self):
return self .__ nombre
def get_valor (self):
return self .__ valor
Entonces tenemos una lista con algunos productos:
from model import Producto
Chocolate = Producto("Chocolate", 4.35)
Jugo = Producto("Jugo", 3.75)
Frijoles = Producto("Frijoles", 10.5)
Producto = [Chocolate, Jugo, Frijoles]
print Productos
Si ejecutamos este código, tenemos el siguiente resultado:
[nombre:Chocolate valor:4.35, nombre:Jugo valor:3.75, nombre:Frijoles valor:10.5]
Por ahora, todo va como se esperaba. ¿Pero qué pasa si queremos agregar un nuevo producto a esta lista? ¿Cómo podemos hacer eso? En las listas de Python, hay dos funciones capaces de agregar elementos, que son append
y extend
. ¡Entonces probemoslos! Comenzaremos con el append
:
producto4 = Producto("Queso", 4.25)
productos.append(producto4)
print productos
Mira cuál es el resultado:
[nombre:Chocolate valor:4.35, nombre:Jugo valor:3.75, nombre:Feijao valor:10.5, nombre:Queso valor:4.25]
Aparentemente todo salió como se esperaba. Entonces, probemos la función extend
:
producto4 = Producto("Queso", 4.25)
productos.extend(producto4)
print productos
Probamos el código nuevamente:
TypeError: 'Producto' object is not iterable
¡Uy! Parece que extender no puede agregar un objeto a la lista ... ¿En serio? Si analizamos el mensaje de error, nos informa que el objeto de tipo "Producto" no es iterable, pero ¿qué significa eso?
extend
, a diferencia de append
, itera sobre el elemento que desea agregar, es decir, involucra el argumento pasado por parámetro dentro de un ciclo, y luego agrega los valores contenidos dentro de ese parámetro, en este caso, intentó hacer esto con el objeto del tipo Producto. Esta es precisamente la razón por la cual no fue posible agregar el objeto de tipo Producto y presentó este error.
Entonces, ¿eso significa que no podemos usar extend para agregar objetos?
¡No exactamente!
Una solución a este problema es, en lugar de enviar un objeto puro, enviar como parámetro una estructura iterable que contenga un objeto de tipo "Producto", es decir, ¡envíe una lista que contenga un Producto!
producto4 = Producto("Queso", 4.25) productos.extend([producto4])
print productos
¿Funciona ahora? Veamos el resultado:
[nombre:Chocolate valor:4.35, nombre:Jugo valor:3.75, nombre:Frijoles valor:10.5, nombre:Queso valor:4.25]
Funcionó como se esperaba! Sin embargo, ¡solo hemos agregado un solo elemento! ¿Qué pasa si quisiéramos agregar varios elementos? En otras palabras, agregar una lista de nuevos productos. ¿Funcionaría sin problemas? Probemos primero con el append
:
producto_nuevo1 = Producto("Jugo", 4.5)
producto_nuevo2 = Producto("Pan", 3.0)
productos_nuevos = [producto_nuevo1, produecto_nuevo2]
productos.append(productos_nuevos)
print productos
Al probar el código obtenemos el siguiente resultado:
[nombre:Chocolate valor:4.35, nombre:Jugo valor:3.75, nombre:Frijoles valor:10.5, [nombre:Jugo valor:4.5, nombre:Pan valor:3.0]]
Aparentemente funcionó, pero observe que en lugar de agregar cada producto a la lista de productos, ¡agregó una lista completa! Es decir, cuando usamos append simplemente agrega el valor completo a la lista. Pero, ¿y si usamos extend
? ¿Funciona? Es decir, ¿agrega producto por producto? Vamos a revisar:
producto_nuevo1 = Producto("Jugo", 4.5) producto_nuevo2 = Producto("Pan", 3.0)
productos_nuevos = [producto_nuevo1, Producto_nuevo2]
productos.extend(productos_nuevos)
print productos
Ejecutando el código nuevamente
[nombre:Chocolate valor:4.35, nombre:Jugo valor:3.75, nombre:Frijoles valor:10.5, nombre:Jugo valor:4.5, nombre:Pan valor:3.0]
Funcionó como se esperaba! Por lo tanto, concluimos que las dos funciones funcionan de la siguiente manera:
Append: Agrega cualquier valor completo, por ejemplo, si enviamos un objeto, agrega el objeto, si enviamos una lista, agrega la lista completa en lugar de sus elementos.
Extend: agrega elementos de una estructura iterable, por ejemplo, si enviamos un objeto puro, no sabe cómo agregarlo, sin embargo, si enviamos ese mismo objeto dentro de una lista, escaneará la lista y agregará ese objeto y, si hay otros, el resto dentro de la lista.
Podemos ver claramente la diferencia entre las dos funciones cuando intentamos agregar una string, por ejemplo, la string "chocolate":
palabras = []
palabras.append("chocolate")
print palabras
Resultado del append:
['chocolate']
palabras = []
palabras.extend("chocolate")
print palabras
Resultado del append:
['c', 'h', 'o', 'c', 'o', 'l', 'a', 't', 'e']
Tenga en cuenta que, mientras append agrega toda la cadena, extend agregó letra por letra, porque la string, detrás de escena, es una array de char
, por lo que escanea esta array, es decir, esta estructura iterable, y agrega cada artículo.
¿Qué tal aprender más sobre Python y sus diversos recursos? Entonces, ¡Mira nuestros cursos de Python para Data Science aquí en Alura!
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Puedes realizar el pago de tus planes en moneda local en los siguientes países:
País | |||||||
---|---|---|---|---|---|---|---|
Plan Semestral |
483.89
BOB |
68076.59
CLP |
304837.12
COP |
65.90
USD |
264.78
PEN |
1428.79
MXN |
2977.87
UYU |
Plan Anual |
733.54
BOB |
103199.56
CLP |
462112.72
COP |
99.90
USD |
401.39
PEN |
2165.95
MXN |
4514.26
UYU |
Acceso a todos
los cursos
Estudia las 24 horas,
dónde y cuándo quieras
Nuevos cursos
cada semana