Introducci贸n

1

El Zen de Python

Conjuntos

2

Sets

3

Modificando conjuntos

4

Operaciones con conjuntos

5

Playgrounds: Elimina elementos duplicados usando conjuntos

Comprehensions

6

List Comprehension

7

Dictionary Comprehension

8

Dictionary Comprehension: condition

9

Playgrounds: Crea una lista usando List Comprehension

10

Lists vs. Tuples vs. Sets

Funciones

11

Funciones

12

Funciones: return

13

Par谩metros por defecto y m煤ltiples returns

14

El scope

15

Refactor game

16

Playgrounds: Tienda de Tecnolog铆a

17

Funciones an贸nimas: lambda

18

Higher order function: una funci贸n dentro de otra funci贸n

19

Map

20

Map con diccionarios

21

Reto: map con inmutabilidad

22

Playgrounds: Multiplica todos los elementos por dos

23

Filter

24

Playgrounds: Retorna solo palabras de 4 letras y m谩s

25

Reduce

M贸dulos

26

M贸dulos

27

Mis propios m贸dulos

28

M贸dulos como scripts: __name__ y __main__

29

Paquetes

30

Playgrounds: Calcular la suma de todas las compras

Manipulaci贸n de archivos y errores

31

Iterables

32

Errores en Python

33

Manejo de excepciones

34

Playgrounds: Captura la excepci贸n: ZeroDivisionError

35

Leer un archivo de texto

36

Escribir en un archivo

37

Leer un CSV

38

Playgrounds: Lee un CSV para calcular el total de gastos

Gr谩ficas en Python

39

Creando una gr谩fica

40

Reto: graficando la poblaci贸n de un pa铆s

41

Reto: graficando la poblaci贸n mundial

Pr贸ximos pasos

42

隆Conoce otros proyectos de este curso!

43

Reconoce tu proceso y certif铆cate

44

Toma el Curso de PIP y Entornos Virtuales con Python

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Adquiere por un a帽o todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

1D
5H
6M
24S

Reto: map con inmutabilidad

21/44
Recursos

Aportes 63

Preguntas 13

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Estar铆a interesante tener una inmersi贸n mayor de estos terminos (inmutabilidad, mutabilidad) dentro de la POO. 馃

Me gustar铆a que este docente se ocupe de toda la ruta de backend con Python 驴Les gusta la idea?

Vamos Platzi por ese curso de mutabilidad e inmutabilidad.

Realmente me parece confuso que utilice nombres muy similares, creo que no es lo mas adecuado para un curso basico pues se pueden confundir los conceptos. A lo que me refiero es que uso items, item, new item, new items. Quiz谩 se deberia explicar un poco mejor a que se refiere cada uno de estos

lo que acaba de hacer en este curso a esa funci贸n se le llama: Funciones puras
tiene como objetivo no crear efectos secundarios creando una copia del input, modificando y luego retornando esta copia modificada

tambi茅n ser铆a bueno una escuela de programaci贸n para ni帽os dentro de platzi

tambien pueden usar la funcion copy.deepcopy(鈥榣ista que se quiere copiar鈥) del archivo copy que copia todos los objetos que guarda nuestra lista (no es necesario que se guarde en ninguna variable si se envia como parametro) de esta manera nuestra lista original queda inmutable y tenemos una copya de esta con los cambios que generamos

import copy

items = [
    {
        'product':'remera',
        'price':100,
    },
    {
        'product':'pantalon',
        'price':300,
    },
    {
        'product':'pantalon 2',
        'price':200,
    },
]

def add_campo_sum( item):
    item['taxes'] = item['price'] * .19
    return item

print(items)

price = list(map(lambda item: item['price'], items))
print(price)

new_item = list(map(add_campo_sum,copy.deepcopy(items)))
print(f'Lista vieja \n{items}')
print(f'Lista nueva \n{new_item}')

Habiendo estudiado punteros en C en la universidad hizo mucho m谩s f谩cil esta lecci贸n. Supongo que si alguien no entendi贸 muy bien puede buscar una clase te贸rica en youtube acerca de posiciones de memoria, punteros y parametros por copia y referencia.

Con base en el video que comparti贸 un compa帽ero: How variables work in Python | Explained with Animations

En Python, no se asigna un tipo de dato a una variable, en su lugar, todo es un objeto.

Cuando se asigna un valor a una variable, un nuevo objeto es creado en memoria. Un PyObject representa la estructura base de todos los objetos de Python, conteniendo:

  • Tipo de dato
  • Cantidad de referencias
  • Valor

Estos objetos no se mueven en memoria, por lo que tienen un tama帽o fijo y una direcci贸n en memoria.

Con esto el mente, el tipo de dato no se asocia a la variable sino que es informaci贸n almacenada en el objeto, es por ello que es posible almacenar diferente tipo de informaci贸n en cada variable, haciendo de Python un lenguaje de tipado din谩mico.

Ahora bien, es importante resaltar lo siguiente:

Objetos inmutables

Se llamar谩n as铆 a los objetos cuyo estado interno no se puede modificar una vez se han creado, como los n煤meros o los Strings.

  • El nombre de la variable es una referencia al objeto, lo que hace que aumente la 鈥渃antidad de referencias鈥 de dicho objeto.
  • Si un nuevo valor se asigna a la misma variable, se crea un nuevo objeto en una direcci贸n de memoria diferente, donde la variable apuntar谩 a dicho nuevo objeto. Con esto la cantidad de referencias de ambos objetos ser谩 actualizada, disminuyendo (o haci茅ndose 0) en el primer objeto y aumentando (o siendo 1) en el nuevo.
  • El administrador de memoria de Python limpia peri贸dicamente los objetos cuya cantidad de referencias es 0 en un proceso llamado 鈥garbage collection鈥. Esto asegura que el uso total de memoria de la aplicaci贸n se mantenga bajo.
  • En caso tal de que una variable sea creada tomando como valor otra variable, no se crear谩 otro objeto, sino que har谩 referencia al objeto de la primera variable, aumentando por consiguiente la cantidad de referencias.
  • Al eliminar una variable, no se elimina el objeto al que hace referencia, solo disminuye la cantidad de referencias de dicho objeto. Al llegar a 0, como se ha indicado, ser谩 eventualmente limpiado a trav茅s del proceso de 鈥garbage collection鈥.

Objetos mutables

Para variables de tipo contenedor, como listas o diccionarios. Estos pueden almacenar diversos valores y su estado interno puede ser modificado al almacenar o eliminar elementos.

Para este tipo de variables, en lugar de un PyObject se tiene un PyVarObject, el cual es un PyObject con un campo adicional para el tama帽o, que tiene la cantidad de elementos almacenados en el objeto contenedor.

Se tiene, entonces:

  • El valor del PyVarObject ser谩 un puntero a la ubicaci贸n en memoria del arreglo donde los elementos est谩n realmente almacenados.
    • Los elementos no est谩n directamente almacenados en dicho arreglo tampoco, en su lugar, este arreglo tambi茅n tiene punteos a la ubicaci贸n en memoria de los elementos, que ser谩n PyObject.
  • De forma similar a los objetos inmutables, si una variable es creada tomando como valor otra variable, no se crear谩 otro objeto, sino que har谩 referencia al objeto de la primera variable, aumentando por consiguiente la cantidad de referencias del PyVarObject.
  • Si se agregan nuevos elementos al contenedor:
    • Se agregar谩 un nuevo objeto en Python.
    • Se actualiza el arreglo que contiene las ubicaciones en memoria de los PyObject.
    • Se actualiza el tama帽o del PyVarObject.
  • Es posible que el arreglo que contiene las ubicaciones en memoria de los elementos se llene eventualmente, por lo que simplemente se crea otro arreglo y se copian dichas referencias.
    • Como se ha mencionado, las ubicaciones en memoria de los PyObject nunca cambian, solo lo hace el arreglo que las contiene de ser necesario.

si, ser铆a bueno un curso para profundizar exclusivamente sobre este tema de inmutabilidad

Objetos mutables vs inmutables en Python

Todo en Python es un objeto. Y lo que todo reci茅n llegado a Python deber铆a aprender r谩pidamente es que todos los objetos en Python pueden ser mutables o inmutables .

Recomiendo el siguiente v铆deo:

How variables work in Python | Explained with Animations

Explica como funciona la referencia al momento de asignar listas.

Map con inmutabilidad

El problema de la modificacion de la lista original tras aplicar una transformacion con un map se debe a la referencia en memoria, es decir, cuando trabajamos con un diccionarios hay un espacio en memoria reservada para ese diccionario; al aplicar una transformacion sobre el diccionario, los nuevos valores se asignan al diccionario como una referencia en memoria; entonces al hacer una modificacion se aplica tanto para el array original como para el nuevo ya que ambos comparten la misma referencia en memoria.

Solucion con el metodo copy()

#-------------Quitar la referencia en memoria del diccionario------------------

items = [
  {
    'product':'camisa',
    'price':100
  },
  {
    'product':'pantalon',
    'price':300
  },
  {
    'product':'vestido',
    'price':150
  },
  {
    'product':'chaqueta',
    'price':400
  }
]

# al agregar el metodo copy desreferenciamos el array original con el nuevo
def add_taxes(items):
  new_item = items.copy()
  new_item['taxes'] = new_item['price'] * .19
  return new_item
  
new_items = list(map(add_taxes, items))
print('New list')
print(new_items)
--> New list
		[{'product': 'camisa', 'price': 100, 'taxes': 19.0}, 
		 {'product': 'pantalon', 'price': 300, 'taxes': 57.0}, 
		 {'product': 'vestido', 'price': 150, 'taxes': 28.5}, 
		 {'product': 'chaqueta', 'price': 400, 'taxes': 76.0}]

print('Old list')
print(items)
--> Old list
		[{'product': 'camisa', 'price': 100}, 
		 {'product': 'pantalon', 'price': 300}, 
	   {'product': 'vestido', 'price': 150}, 
		 {'product': 'chaqueta', 'price': 400}]

Si, deinitivamente un curso exclusivo de mutabilidad e inmutabilidad ser铆a genial!!

items = [
  {
    'product':'camisa',
    'price': 100,
  },
  {
    'product':'pantalones',
    'price':300  
  },
  {
    'product':'jeans',
    'price':200  
  }
]

def add_taxes(item):
  new_item = item.copy()
  new_item['taxes'] = new_item['price'] * 0.19
  return new_item
  
new_items = list(map(add_taxes, items))
print('New list')
print(new_items)
print('Old list')
print(items)

Esta es otra manera, que igual cumple con la regla de inmutabilidad:

items = [
    {
        'product': 'shirt',
        'price': 100
    },
    {
        'product': 'pants',
        'price': 250
    },
    {
        'product': 'shorts',
        'price': 30
    }
]
new_items = list(map(lambda item: item | {'taxes': item['price'] * .19}, items))
print(new_items)
print(items)

yo digo que no lo piensen y vamos por ese curso de mutabilidad e inmutabilidad ya que debe haber muchos ejemplos complejos que posiblemente existan y nos ayudar谩 a dominar mejor el lenguaje frente a trabajos futuros.

Apoyo el curso de mutabilidad e inmutabilidad uwu

sii porfavor!!! un curso de mutabilidad e inmutabilidad.

驴POR QU脡 SE MODIFICAN LOS DICCIONARIOS EN UNA LISTA AL UTILIZAR LA FUNCCI脫N map()?

La raz贸n por la cual los diccionarios en la lista original se modifican cuando se aplica map() se debe a c贸mo funcionan los objetos mutables en Python y c贸mo se manejan las referencias a objetos en memoria.

Cuando trabajas con objetos mutables como los diccionarios, est谩s manipulando referencias a esos objetos en lugar de copiar los objetos en s铆. Esto significa que cuando pasas un objeto mutable a una funci贸n y lo modificas dentro de esa funci贸n, est谩s modificando la referencia al objeto en memoria, no est谩s creando una copia independiente del objeto.

Cuando aplicas map() a una lista de diccionarios y modifica esos diccionarios dentro de la funci贸n proporcionada a map(), los cambios se reflejar谩n en los diccionarios originales en la lista. Esto se debe a que los diccionarios en la lista y los diccionarios dentro de la funci贸n son referencias al mismo objeto en memoria.

Si deseas evitar que los cambios afecten a los diccionarios originales en la lista, debes crear copias de esos diccionarios antes de modificarlos dentro de la funci贸n:

# CACLULAMOS EL 脕REA DE LOS RECTANGULOS y lo agregamos como nuevo atributo sin modificar los diccionarios originales.
rectangulos = [
    {'longitud': 5, 'ancho': 4},
    {'longitud': 3, 'ancho': 6},
    {'longitud': 7, 'ancho': 2}
]

# Definimos una funcion  para calcular el 谩rea y crear un nuevo diccionario

def calcular_area(rectangulo):
    new_rectangulo = rectangulo.copy()# Crear una copia del diccionario original
    new_rectangulo['area'] = new_rectangulo['longitud'] * new_rectangulo['ancho']
    return new_rectangulo

# Utilizar map para aplicar la funci贸n calcular_area a cada rect谩ngulo
rangulos_con_areas = list(map(calcular_area, rectangulos))

# Imprimir la lista de rect谩ngulos con 谩reas calculadas
print(rangulos_con_areas)

# La lista original 'rectangulos' no se modifica
print(rectangulos)

items = [
{
" producto " : " camisa " ,
" precio " : 80000 ,
},

{
    " producto " : " pantalon " ,
    " precio " : 110000
},

{
    " producto " : " zapatos " ,
    " precio " : 200000
}

]
print(type(items))

productos = list ( map ( lambda item: item [" producto " ] , items ) )
print(productos)

precios = list ( map ( lambda item: item [" precio " ] , items ) )
print(precios)

def impuesto (item):
nuevo_item = item.copy()
nuevo_item[ " impuesto " ] = nuevo_item [ " precio " ] * .19
return nuevo_item

nuevos_itemss = list(map( impuesto , items ))

print (nuevos_itemss)
print (items)

Creo que se podria reforzar mas el tema del manejo de documentacion.

Necesitamos que platzi publique el curso de inmutabilidad, mutabilidad es muy importante para la generaci贸n de c贸digo.

En la POO hay dos formas de pasar datos:

  1. Por valor
  2. Por referencia

La funci贸n 鈥榤ap鈥 env铆a a 鈥榓dd_taxes鈥 el valor del objeto iterado por referencia, es decir, env铆a realmente la direcci贸n de memoria, ej: 0x10eba. Por ello es necesario hacer una copia para que el nuevo elemento tenga una direcci贸n de memoria distinta y as铆 no se altere el elemento original.

estar铆a bien si todos los nombres de las funciones y variables entren solo en espa帽ol , porque en ingles me parece confuso apenas voy aprendiendo

Y el curso quedar谩 en sue帽os ? 馃槄

Me encantaria un curso de ese tema

Acabo de notar que el map es similar a usar un apply. Ahora a ponerlo en pr谩ctica

items = [
  {
    'product': 'camisa',
    'price': 100
  },
  {
    'product': 'pantalones',
    'price': 200
  },
  {
    'product': 'joggers',
    'price': 348
  },
  
]

# cuando se modifica un diccionario puede que se est茅 modificando todo el array original y no uno nuevo
prices = list(map(lambda item: item['price'], items))
print(items)
print(prices)

def add_taxes(item):
  new_item = item.copy()
  new_item['taxes'] = new_item['price'] * .19
  return new_item

new_items = list(map(add_taxes, items))
print(new_items)
print(items)

Me gusta que el curso se mantenga enfocado al objetivo.

A futuro si me gustar铆a saber mas sobre mutabilidad e inmutabilidad. ojal谩 haya un curso al respecto.

Cualquier tema que mejore mi conocimiento en python es bienvenido

Me sumo al apoyo por el curso de mutabilidad e inmutabilidad y el curso de POO en Python 馃檶

A la hora de trabajar con redes neuronales es muy importante y una buena pr谩ctica usar funciones puras o inmutables. Muy buen video, 隆Saludos!

INMUTABILIDAD EN PYTHON

  • Se refiere a la caracter铆stica de algunos tipos de datos que no pueden ser modificados una vez que se han creado.
  • Por ejemplo, los n煤meros y las cadenas de texto son tipos de datos inmutables en Python,
  • Significa que cualquier operaci贸n que parezca modificarlos en realidad crea un nuevo objeto en la memoria en lugar de cambiar el objeto original.
  • Esta propiedad es importante para evitar errores y garantizar que los datos no cambien inesperadamente en un programa.

Sigo esperando los cursos prometidos, tanto este como el anterior! No veo fecha hasta el momento.

Les comparto el c贸digo de la clase con la explicaci贸n de la referencia en memoria dada por Nico!
Realmente me result贸 algo confuso, pero me queda claro que esta situaci贸n solo se presenta con los diccionarios.
Seguro en las pr贸ximas clases todo pueda verse m谩s familiar y m谩s claro.

# Reto: map con inmutabilidad

'''
Map es una de las funciones que se considera que no modifica el estado del array original, por el contrario, crea uno nuevo.
Sin embargo, aqui se evidencia una modificacion en el array, que tiene que ver con una referencia en memoria.
驴Por qu茅 ocurre?
Cuando trabajamos con un diccionario, hay una referencia, es decir un espacio en nuestra computadora, que tiene este diccionario.
Cuando hacemos operaciones con numeros primitivos, es decir un array de numeros, un array de strings y hacemos transformaciones, all铆 lo que hacemos es que en esa transformacion se est谩 calculando un nuevo valor, por ejemplo multiplicarlo por 2, y ese valor es asignado al array. Pero cuando trabajamos con diccionarios, no se asigna como un nuevo valor, el diccionario se asigna como una referencia en memoria, entonces al hacer una modificacion, se hace una modificaci贸n tanto para el array original como para el nuevo. Estamos modificando los dos array, porque los dos comparten la misma referencia en memoria.

驴Como hago para poder sacar esa referencia en memoria?
Creamos una copia del diccionario original, haciendo uso de la funcion copy. Esto copia todos los valores de ese diccionario, pero no se trae esa referencia.
'''

# Lista de diccionarios
items = [
  {
    'product': 'camisa',
    'price': 100
  },
  {
    'product': 'pantalones',
    'price': 300
  },
  {
    'product': 'chaqueta',
    'price': 600
  }
]

# Agregamos un nuevo atributo al diccionario
def add_taxes(item):
  new_item = item.copy()
  new_item['taxes'] = new_item['price'] * .19
  return new_item

new_items = list(map(add_taxes, items)) 
print("New list")
print(new_items)
print("Old list!")
print(items)

Lo mismo sucede con los Dataframes usando la libreria pandas, si no quieres modificar el dataframe original es mejor hacer una copia del mismo

Ahhhhhh ya entiendo por que me pasaba lo que me pasaba, gracias

Este video me record贸 a los punteros en C, donde env铆as una direcci贸n de memoria y no el valor, sin embargo, no domin茅 ese tema =S

S铆, tambi茅n quiero el curso de (in)mutabilidad.

Si por favor un curso de mutabilidad y de inmutabilidad. Por favor.

Creo que esta perfecta tu manera de explicarlo鈥

Apoyo la idea del curso de inmutabilidad y mutabilidad.

La funci贸n copy solo nos funciona para niveles superficiales, sin embargo cuando tenemos variables listas dentro de listas, estas listas internas se se modifican dentro la original, una recomendaci贸n es
import copy y llamar el m茅todo deepcopy(), este si copia todas esas estructuras internas de las variables.

Si seria interesante y 煤til un curso de mutabilidad e inmutabilidad en Python.

Platzi si me gustar铆a profundizar en los conceptos de mutabilidad e inmutabilidad 馃槃

Si si, hagan ese curso de inmutabilidad, mutabilidad, y tal vez de otros conceptos t茅cnicos sobre programaci贸n, porque esos temas me confunden un poco.

El metodo .copy() de python me recuerda mucho al spread operator de javascript 鈥溾︹ Muy buena clase a ser verdad!

Yo lo hice as铆:

items = [
    {
        'product': 'camisa',
        'price': 100,
    },
    {
        'product': 'pantalon',
        'price': 200,
    },
    {
        'product': 'Tenis',
        'price': 300,
    },
]

map_obj = lambda obj : {
    'product': obj['product'],
    'price': obj['price'],
    'taxes': obj['price'] * .19,
}

items2 = list(map(map_obj, items))
print('New')
print(items2)
print('Old')
print(items)

Saludos

a mi no me funciono el utilicera el copy para cambiar la old list con la nueva

Deberias hacer el curso de POO de python el otro profe no es tan Pro como t鈥檜, un fuerte abrazo

Me gusta la idea de un curso en los temas de mutabilidad e inmutabilidad.

y si porfavor, todo lo q sea nuevo y de valor hagamoslo nomas jajaja xD

Si Platzi鈥urso de mutabilidad e inmutabilidad dicatado por Nicol谩s!

Me encantaria un curso de inmutabilidad, seria muy interesante profundizar sobre ese tema.

Seria de mucha ayuda profundizar mas en estas situaciones de inmutabilidad

El diccionario comparte el mismo espacio de memoria por lo que una modificaci贸n no crea un nuevo espacio de memoria y la almacena en la misma.

vamos por ese curso de inmutabilidad y mutabilidad

Ya ha quedado!

vamos con ese curso de mutabilidad e inmutabilidad!

tambi茅n ser铆a muy bueno un curso sobre el tema de los xml, debido a que hoy por hoy est谩n usando para los temas de facturaci贸n electr贸nica en varios pa铆ses.

en mi caso particular tengo la necesidad de leer y montar bases de datos con los xml de la DIAN colombia.

Me encant贸

items = [
  {
    'product':'laptop',
    'price': 200
  },
  {
    'product':'mouse',
    'price': 15
  },  
  {
    'product':'camera',
    'price': 55
  },
  {
    'product':'headphones',
    'price': 15
  }
]

price = list(map(lambda items: items['price'], items))
print(price)

def taxes_item(items):
  new_items = items.copy()
  new_items['taxes'] = items['price'] * .22
  new_items['full_price'] = items['price'] + new_items['taxes']
  return new_items
  
taxes = list(map(taxes_item, items))
print('Old Dic')
print(items)
print('New Dic')
print(taxes)
<items = [
  {
    'product': 'camisa',
    'price': 100,
  },
  {
    'product': 'pantalones',
    'price': 300
  },
  {
    'product': 'pantalones 2',
    'price': 200
  }
]

def add_taxes(item):
  new_item = item.copy()
  new_item['taxes'] = new_item['price'] * .19
  return new_item

new_items = list(map(add_taxes, items))
print('New list')
print(new_items)
print('Old list')
print(items)>