B谩sicos del Lenguaje

1

Gu铆a de instalaci贸n y conceptos b谩sicos

2

Archivos y slides del curso pr谩ctico de Python

3

IMPORTANTE: Instalando Ubuntu Bash en Windows para facilitarte el seguimiento del curso desde Windows.

4

驴Qu茅 es la programaci贸n?

5

驴Por qu茅 programar con Python?

6

Operadores matem谩ticos

7

Variables y expresiones

8

Presentaci贸n del proyecto

9

Funciones

10

Usando funciones en nuestro proyecto

11

Operadores l贸gicos

12

Estructuras condicionales

Uso de strings y ciclos

13

Strings en Python

14

Operaciones con Strings en Python

15

Operaciones con strings y el comando Update

16

Operaciones con strings y el comando Delete

17

Operaciones con strings: Slices en python

18

For loops

19

While loops

20

Iterators and generators

Estructuras de Datos

21

Uso de listas

22

Operaciones con listas

23

Agregando listas a nuestro proyecto

24

Diccionarios

25

Agregando diccionarios a nuestro proyecto

26

Tuplas y conjuntos

27

Tuplas y conjuntos en c贸digo

28

Introducci贸n al m贸dulo collections

29

Python comprehensions

30

B煤squedas binarias

31

Continuando con las B煤squedas Binarias

32

Manipulaci贸n de archivos en Python 3

Uso de objetos y m贸dulos

33

Decoradores

34

Decoradores en Python

35

驴Qu茅 es la programaci贸n orientada a objetos?

36

Programaci贸n orientada a objetos en Python

37

Scopes and namespaces

38

Introducci贸n a Click

39

Definici贸n a la API p煤blica

40

Clients

41

Servicios: L贸gica de negocio de nuestra aplicaci贸n

42

Interface de create: Comunicaci贸n entre servicios y el cliente

43

Actualizaci贸n de cliente

44

Interface de actualizaci贸n

45

Manejo de errores y jerarqu铆a de errores en Python

46

Context managers

Python en el mundo real

47

Aplicaciones de Python en el mundo real

Conclusiones finales

48

Python 2 vs 3 (Conclusiones)

Clases bonus

49

Entorno Virtual en Python y su importancia: Python en el mundo real

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:

0D
21H
51M
28S

Actualizaci贸n de cliente

43/49
Recursos

Aportes 25

Preguntas 5

Ordenar por:

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

o inicia sesi贸n.

Hay dos errores potenciales, en el codigo que se ve en el video, pasa que no entiendo porque platzi recorta los videos y deja a los alumnos con un mal sin sabor鈥 no me gusta esto para anda鈥

primero que todo el metodo

<def _save_to_disk(updated_clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name) as f:
            writer = csv.DictWriter(f, fieldnames=ClientModel.schema())
            writer.writerows(updated_clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)>

esta mal codificado, le falta el parametro del objeto actual self
y el mode para la funcion open, deberia de quedar asi.

<def _save_to_disk(self, updated_clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name, mode='w') as f:
            writer = csv.DictWriter(f, fieldnames=ClientModel.schema())
            writer.writerows(updated_clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)>

Me cost贸 mucho entender estos dos ultimos videos, los v铆 graves, se saltaron explicaciones importantes, creo que todo est谩 muy fuera de contexto, alg煤n esquema inicial, introduccion a click y por qu茅 se usa ese esquema de carpetas ser铆a de gran ayuda, aparte la explicaci贸n de POO es muy pobre, siento que ah铆 fallaron un poco.

As铆 me funciono def_save_to_disk

<	def _save_to_disk(self, clients):
		tmp_table_name = self.table_name + '.tmp'
		with open(tmp_table_name, mode='a') as f:
			writer = csv.DictWriter(f, fieldnames=Client.schema())
			writer.writerows(clients)

		os.remove(self.table_name)
		os.rename(tmp_table_name, self.table_name)>

Error en el segundo 3:45 deben agregar el modo en el que abren el archivo, sino les dar谩 error.
Escriban lo siguiente:

with open(tmp_table_name, mode = 'w') as f:

Una consulta, por que a David le funciona sin colocar el self en la funcion _save_to_disk?

def _save_to_disk(self,clients):
		tmp_table_name = self.table_name+'.tmp'
		with open(tmp_table_name,mode='as') as f:
			writer = csv.DictWriter(f, fieldnames=Client.schema())
			writer.writerows(clients)
		os.remove(self.table_name)
		os.rename(tmp_table_name, self.table_name)

He llegado a este punto sin entender casi nada de lo que se ha hecho con POO en Python, es demasiado contenido para el ultimo bloque, si llegaron hasta aqui y no entendieron casi nada, toca regresar y analizar leccion por leccion junto con el codigo, ademas de hacer busqueda de los temas que queden en duda

creo que estar铆a muy bien hacer un esquema previo con lo que se va hacer con los pasos y el resultado y final y porque es asi y no de otra manera y quiz谩 estar铆a interesante saber todo lo que le falta鈥

Decepcionante c贸mo un curso que en sus inicios era tan fant谩stico decae por decisiones tan paup茅rrimas como 鈥渢erminar r谩pido la grabaci贸n鈥 o no hacer un curso tan extenso.
Creo que todos estamos aqu铆 por aprender y no por sacar certificados de manera pronta. Bajo esa misma l贸gica, considero que la calidad del curso debe primar por encima de todo, independientemente de si las explicaciones duran 5 minutos o 40.
Platzi team, reevaluen la calidad de este curso, nos est谩n fallando a nosotros como clientes y principalmente como estudiantes.

Es mala practica llamar 鈥渦pdated_client鈥 a un 麓麓argumento麓麓 y llamar 鈥渦pdated_clients鈥 a una 麓麓variable麓麓 dentro de una funcion??

Ya vamos comprendiendo mejor el tema

Es un buen profesor la verdad explica muy bien y detalladamente, he visto algunas quejas sobre algunas de las ultimas clases, pero es que se ense帽a el uso de un lenguaje no de un framework, mucho no comprenden eso, no se intenta profundizar en el framework, el proyecto final es mas para ver como podemos aplicar lo aprendido y usarlo en el mundo real y si nos llama la atenci贸n el framework nos motiva a investigar mas sobre el.

Como yo que le tengo un cari帽o inmenso a Qt y lo descubr铆 gracias a que un programa de animacion que es mi favorito de c贸digo abierto. Pero solo aprend铆 a usarlo en C++ y me toco investigar el como usarlo en python y cr茅anme no hay info ni tutos que lo explique, en espa帽ol ni en ingles (en su modo vainilla y no con dise帽adores gr谩ficos con QtDisigner) as铆 que me toco ver su documentaci贸n directa del framework en su pagina oficial.

Por eso creo que el profesor hizo un excelente trabajo ense帽谩ndonos el lenguaje y en sus ultimas clases nos dio la oportunidad de interesarnos por un framework que puede convertirse en uno de nuestros favoritos o no.

鈥淧D: cuando leia las frases: 鈥 no explica ha profundidad el uso de CLICK o que esta fuera de contexto, cosas y asi-- lo que lei fue: soy un perezoso que no le gusta investigar鈥

En la parte de abajo de la descripci贸n de habla sobre errores. Eso no pertenece a este curso

La verdad nunca pude ejecutar nada en el cmd, cuando le doy pv --help, o pv client create, etc simplemente no hace nada.
Logr茅 crear el ambiente virtual, y creo que pude ejecutar lo de pip install --editable .
Si le doy where pv, me da dos rutas, el pv.py y uno en pytho38 en el disco C
驴Alguien podr铆a ayudarme? Hice las clases, copi茅 el c贸digo, etc, pero la verdad hace como 5 clases que me perd铆 horrible y no entiendo ni lo que hemos hecho.

El c贸digo del profe estaba incompleto, el mismo IDE dice apenas se escribe self que algo falta. en la clase 39 esta el c贸digo del profe, pero aqu铆 les comparto si quieren adicional ver con list comprehension.

  • 'w'open for writing, truncating the file first

Lo m谩s 煤til del curso fue saber que exist铆a click y que de alguna manera nos puede ayudar para lo que buscamos鈥 pero no m谩s. Para aprenderlo nos va tocar navegar por internet y buscar informaci贸n gratuita que no conseguimos en un sitio de PAGO como lo es Platzi.
No tiene sentido, estoy sumamente defraudado, deber铆an grabar nuevamente este curso pero con Facundo que s铆 sabe organizar sus ideas.

Desde la clase 39 en adelante me ha constado mucho entender 馃槮.

Hice un agregado al codigo, ya que si no encuentra el Client a modificar, igualmente va a tener que guardar toda la informaci贸n, con una condicionar y return se puede arreglar o evitar.

...
        if client_list == updated_clients:
            return # No changes in Clients db, skip rewrite
...

Compa帽eros mexicanos, en su pa铆s dicen 鈥渃iclar鈥 o dicen 鈥渋terar鈥?

Mi reto cumplido

commands.py

@clientes.command()
@click.argument('client_uid',
              type=str)
@click.pass_context
def delete(ctx, client_uid):
    """Elimina un cliente"""
    client_service = ClienteService(ctx.obj['clients_table'])
    client_list = client_service.list_clients()
    client = [client for client in client_list if client['uid'] == client_uid]
    if client:
            ##Desmpaqueta el diccionario al modelo de ClientModel
            client = ClienteModel(**client[0])
            client_service.delete_client(client)
            click.echo('Client deleted')
    else:
            click.echo('ID not in list')

services.py

    def delete_client(self, client_removed):
        clients = self.list_clients()
        for client in clients:
            if client['uid'] == client_removed.uid:
                clients.remove(client)
        self._save_to_disk(clients)

implementacion inicial de actualizar y eliminar

se implementan dos metodos
actualizar
se modifico 2 Archivos
service.py
se agrego funcion update_client() //metodo que recive un obejto cleinte y guarda
se agrego funcion _save_to_disk() //guardamos en disco la lista de clientes
commands.py
se modifica update_client() //metodo que espera un parametro uid del cleinte
// y se envia y genera un un flujo de actualizacion _update_client_flow()
// y se actuliza usando el metodo update_client() de la clase Clientservice
se agrego funcion _update_client_flow() //metodo que genera flujo con el usuario para actualizar datos del cleinte

eliminar
se modifico 2 Archivos
service.py
se agrego delete_client() //metodo que recive un obejto cliente elimina y guarda
commands.py
se modifica delete_client() //metodo que espera un parametro uid del cliente
//y se elimina usando el metodo delete_client() de la clase Clientservice

Hasta ahora no me funciona! ME dice que pv no lo reconoce como una comando a pesar de seguir las instruccions! Un companero comentO que instale sudo apt install pv pero no en windows me dice que no reconoce windows ni apt
Lo intento hacer en bash pero al activar el entorno virtual me aparece:

lksengineer@DESKTOP-U6E9MPM:/mnt/c/PYTHON/PYTHON/CRUD/PLATZI-VENTAS$ source venv/Scripts/activate
: command not found
: command not found

y si lo intento activar como lo instalo en la cmd

lksengineer@DESKTOP-U6E9MPM:/mnt/c/PYTHON/PYTHON/CRUD/PLATZI-VENTAS$ venv/Scripts/activate
venv/Scripts/activate: line 3: $'\r': command not found
venv/Scripts/activate: line 4: $'\r': command not found
venv/Scripts/activate: line 10: syntax error near unexpected token `$'{\r''
'env/Scripts/activate: line 10: `deactivate () {

Esta algo complicado me costo entender pero el punto es devolverse para fijarse tomar nota analizar y probar tu mismo! sigamos avanzando馃敟

No olviden que en clases anteriores nos pasaron los archivos con todo el c贸digo.

.
Es de gran ayuda poder comparar y dar seguimiento pues en esta ocasi贸n se les fue un error. **Muchas gracias tambi茅n a todos los que han compartido el c贸digo para seguir avanzando, siempre grandes aportes.
.
Mi c贸digo:

def update_client(self, updated_client):
        clients = self.list_clients()
        updated_clients = []

        for client in clients:
            if client['uid'] == updated_client.uid:
                updated_clients.append(updated_client.to_dict())
            else:
                updated_clients.append(client)
        
        self._save_to_disk(updated_clients)
    
    # Para guardar la lista actualizada en el disco utilizamos el m茅todo privado _save_to_disk()
    def _save_to_disk(self, clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name, mode='w') as f:
            writer = csv.DictWriter(f, fieldnames= Client.schema())
            writer.writerows(clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)

next

No entiendo para qu茅 las condicionales dentro del for-loop si a la final lo que hace es pasar los clientes de una lista a otra, incluyendo al cliente actualizado