CursosEmpresasBlogLiveConfPrecios

Programando closures

Clase 9 de 21 • Curso Profesional de Python

Clase anteriorSiguiente clase

Contenido del curso

Introducción

  • 1
    ¿Qué necesitas saber para tomar el curso?

    ¿Qué necesitas saber para tomar el curso?

    03:15 min
  • 2
    ¿Cómo funciona Python?

    ¿Cómo funciona Python?

    07:49 min
  • 3
    Cómo organizar las carpetas de tus proyectos

    Cómo organizar las carpetas de tus proyectos

    07:15 min

Static Typing

  • 4
    ¿Qué son los tipados?

    ¿Qué son los tipados?

    10:26 min
  • 5
    Tipado estático en Python

    Tipado estático en Python

    14:26 min
  • 6
    Practicando el tipado estático

    Practicando el tipado estático

    13:33 min

Conceptos avanzados de funciones

  • 7
    Scope: alcance de las variables

    Scope: alcance de las variables

    06:32 min
  • 8
    Closures

    Closures

    08:21 min
  • 9
    Programando closures

    Programando closures

    Viendo ahora
  • 10
    Decoradores

    Decoradores

    06:19 min
  • 11
    Programando decoradores

    Programando decoradores

    13:05 min

Estructuras de datos avanzadas

  • 12
    Iteradores

    Iteradores

    13:52 min
  • 13
    La sucesión de Fibonacci

    La sucesión de Fibonacci

    14:01 min
  • 14
    Generadores

    Generadores

    07:22 min
  • 15
    Mejorando nuestra sucesión de Fibonacci

    Mejorando nuestra sucesión de Fibonacci

    06:53 min
  • 16
    Sets

    Sets

    10:58 min
  • 17
    Operaciones con sets

    Operaciones con sets

    06:09 min
  • 18
    Eliminando los repetidos de una lista

    Eliminando los repetidos de una lista

    05:20 min

Bonus

  • 19
    Manejo de fechas

    Manejo de fechas

    08:44 min
  • 20
    Time zones

    Time zones

    08:46 min

Conclusión

  • 21
    Completaste la trilogía. ¿Cómo seguir?

    Completaste la trilogía. ¿Cómo seguir?

    01:30 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
      Isay Humberto Lucas Hernandez

      Isay Humberto Lucas Hernandez

      student•
      hace 5 años
        Angel Mejia

        Angel Mejia

        student•
        hace 4 años
        Wilder Bravo

        Wilder Bravo

        student•
        hace 4 años
      José Martínez Santana

      José Martínez Santana

      student•
      hace 5 años
        Pedro Alvarado Garcia

        Pedro Alvarado Garcia

        student•
        hace 5 años
        Angel Mejia

        Angel Mejia

        student•
        hace 4 años
      Bruno Cornelio

      Bruno Cornelio

      student•
      hace 4 años
        Omar D

        Omar D

        student•
        hace 4 años
        Edwin Ferney Vásquez Hernández

        Edwin Ferney Vásquez Hernández

        student•
        hace 4 años
      Emmanuel Corral Marco

      Emmanuel Corral Marco

      student•
      hace 5 años
        Carlos Rodríguez

        Carlos Rodríguez

        student•
        hace 4 años
      Fabricio González Guasque

      Fabricio González Guasque

      student•
      hace 5 años
        Daniel Felipe Montenegro

        Daniel Felipe Montenegro

        student•
        hace 4 años
      Pedro Alejandro Silva Perez

      Pedro Alejandro Silva Perez

      student•
      hace 4 años
      Adriel Salguero

      Adriel Salguero

      student•
      hace 4 años
        Ronald Daniel Mozo Chávez

        Ronald Daniel Mozo Chávez

        student•
        hace 4 años
        Fabricio Quintas

        Fabricio Quintas

        student•
        hace 4 años
      Alex Junior Rodriguez Huerta

      Alex Junior Rodriguez Huerta

      student•
      hace 4 años
      Adriana Villalobos

      Adriana Villalobos

      student•
      hace 4 años
        Cesar Hernández Ramírez

        Cesar Hernández Ramírez

        student•
        hace 4 años
        Thomas Eduardo Medina Sánchez

        Thomas Eduardo Medina Sánchez

        student•
        hace 4 años
      Alejandro Garcia Chirinos

      Alejandro Garcia Chirinos

      student•
      hace 4 años
      Daniela Castaño

      Daniela Castaño

      student•
      hace 3 años
      Billy Rustrian Burgos

      Billy Rustrian Burgos

      student•
      hace 4 años
      Silvana Ramos

      Silvana Ramos

      student•
      hace 4 años
      César Isaac González Naranjo

      César Isaac González Naranjo

      student•
      hace 4 años
      Mateo Echavarria

      Mateo Echavarria

      student•
      hace 4 años
        David Leonardo Baron Avilan

        David Leonardo Baron Avilan

        student•
        hace 4 años
      Juan Pablo Duque Giraldo

      Juan Pablo Duque Giraldo

      student•
      hace 4 años
        fidel angel ochoa

        fidel angel ochoa

        student•
        hace 4 años
      Jose  Manuel Rivas Márquez

      Jose Manuel Rivas Márquez

      student•
      hace 4 años
        Pablo Antipan Quiñenao

        Pablo Antipan Quiñenao

        student•
        hace 4 años
      Yerson Argote

      Yerson Argote

      student•
      hace 5 años
        Yair Hernández

        Yair Hernández

        student•
        hace 5 años
      CARLOS AUGUSTO RAMIREZ FRANCO

      CARLOS AUGUSTO RAMIREZ FRANCO

      student•
      hace 3 años
      Jesús Alexis Vega López

      Jesús Alexis Vega López

      student•
      hace 4 años

      Hola,

      Encontré que se puede hacer el reto usando una función lambda. El resultado sería el siguiente.

      carbon.png

      Está genial, el único detalle es que si deseas escribir estático la presencia del : en lambda para los argumentos no te deja asignarle un tipo de dato a x en tu ejemplo.

      Y cumple con las 3 características del clousure, gracias Isay.

      Reto

      carbon.png

      Genial el uso del tipado estático.

      Qué es lo que hace la clase Generic?

      Podemos usar lambda functions aquí:

      Screen Shot 2021-09-07 at 13.11.43.png

      Buen aporte!! Has la división con doble diagonal te retorna la división en enteros

      x: x//n

      y con eso 🐍

      Pero si sería una nested funtion?

      reto ampliado:

      Pyrhon 3.9

      def tabla_multiplicar(x: int) -> int: def multiplicaciones(n: int) -> int: my_tabla = {i: i*x for i in range(0,n)} return my_tabla return multiplicaciones def run(): tabla_del_5 = tabla_multiplicar(5) tabla_del_5_hasta_330 = tabla_del_5(330) cinco_multiplicado_por = tabla_del_5_hasta_330 print(cinco_multiplicado_por[221]) if __name__ == "__main__": run()

      La manera más absurda de multiplicar, aunque se puede sacar toda la tabla en un diccionario, lo cual no está mal jeje muy potente esto de las closure, bravísimo curso :)

      Fabuloso :D.

      Mi aporte saludos

      def make_division_by(n): def division(x: int) -> float: assert n > 0, "El valor ingresado en el divisor debe ser mayor a cero" return round(x/n, 2) return division def run(): division_by_3 = make_division_by(3) division_by_5 = make_division_by(5) division_by_18 = make_division_by(18) print(division_by_3(18)) print(division_by_5(100)) print(division_by_18(54)) print(division_by_3(division_by_5(200))) if __name__ == "__main__": run()

      Gracias por tu aporte, tal vez lo unico importante a tener en cuenta es que n si puede ser menor que 0; de esa manera la condición del assert podría ser modificada a "n != 0".

      Humilde aporte

      def make_division_by(n: int): def division(x: int): assert type(x) == int, 'You have to type an int number' return x/n return division def run(): division_by_3 = make_division_by(3) print(int(division_by_3(18))) division_by_5 = make_division_by(5) print(int(division_by_5(100))) division_by_18 = make_division_by(18) print(int(division_by_18(54))) if __name__ == '__main__': run()

      Hola a todos, como andan?

      Programe e siguiente codigo

      <def divisor(number): def dividendo(n): return n//number return number def run(): divided_by_2= divisor(3) divided_by_1point5= divisor(5) divided_by_1000= divisor(18) number= int(input('Please insert your number: ')) divided_by_2(number) divided_by_1point5(number) divided_by_1000(number) print(f'''Your number was {number}. Divided by 3 is: {divided_by_2(10)}, Divided by 5 is: {divided_by_1point5(10)}, Divided by 18 is: {divided_by_1000(10)} ''') if __name__== '__main__': run()>

      Probe con el numero 10, y me arroja :

      Traceback (most recent call last): File "c:/Users/adrie/Desktop/Cursos/Curso-profesional-python/make_division_by.py", line 27, in <module> run() File "c:/Users/adrie/Desktop/Cursos/Curso-profesional-python/make_division_by.py", line 16, in run divided_by_2(number) TypeError: 'int' object is not callable

      No puedo encotnrar el error, alguine podria decirme com ose repara?

      Divided by 3 is tienen que llevar guión bajo y con paréntesis no llaves lo correcto = Divided_by_3_is: (divided_by_2(10))

      1 año tarde, pero recién estoy haciendo el curso, fijate que estas retornando "number" en vez de la función, lo correcto es en esta parte:

      <def divisor(number): def dividendo(n): return n//number return **dividiendo**

      devolver "dividiendo" no el número

      Mi aporte

      def make_division_by(n: int): def division(d: int) -> float: assert n != 0, "No se puede dividir entre cero" return d / n return division def run(): division_by_3 = make_division_by(0) print(division_by_3(18)) division_by_5 = make_division_by(5) print(division_by_5(100)) division_by_18 = make_division_by(18) print(division_by_18(54)) if __name__ == "__main__": run()

      Mi ejercicio resuelto. Me gustaría saber cómo optimizar los asserts para acortar líneas.

      Screen Shot 2021-09-07 at 16.24.10.png

      Para optimizarlos puedes utiliizar el tipado estático, todas esas verificaciones las harás directamente desde las varibales con el tipado estático. Mira:

      from typing import Callable def division_by(n: float) -> Callable[[float], float]: def divisor(m: float) -> float: return m / n return divisor

      Hola, yo use un try para poner una sola línea en caso de error.

      ¿Qué es más eficiente para el código? Utilizar closures con varias funciones anidadas y pasar un parámetro en cada una o simplemente pasarle todos los parámetros a una sola funcion y hacerlo todo ahi? ¿Y porqué?

      Reto:

      def make_division_by(n) -> int: def division_by(x): assert type(x) == int,"Solo poner numeros enteros" return round(x/n) return division_by def run (): division_by_3 = make_division_by(3) print(division_by_3(18)) division_by_5 = make_division_by(5) print(division_by_5(100)) division_by_18 = make_division_by(18) print(division_by_18(54)) if __name__ == "__main__": run()

      Reto cumplido:

      def make_division_by(n): """This closure returns a functions that returns the division of an x number by n""" # You have to code here! def divided_by(x): assert type(x) == int, "Solo puedes usar numeros" result = x/n return result return divided_by division_by_3 = make_division_by(3) print(division_by_3(18)) # The expected output is 6 division_by_5 = make_division_by(5) print(division_by_5(100)) # The expected output is 20 division_by_18 = make_division_by(18) print(division_by_18(54)) # The expected output is 3
      def make_division_by(n): def divisioner(x): assert type(x) == int, "Solo puedes ingresar numeros positivos" return int(x / n) return divisioner def run(): division_by_3 = make_division_by(3) print(division_by_3(18)) division_by_5 = make_division_by(5) print(division_by_5(100)) division_by_18 = make_division_by(18) print(division_by_18(54)) if __name__ == '__main__': run()

      Mi código

      def divisor(d): def make_division(D): return D/d return make_division def run(): div_5 = divisor(5) print(div_5(50)) if __name__ == '__main__': run()

      Este ejercicio se hace prácticamente igual que el ejercicio de la clase pasada donde realizamos

      def make_multiplier(x): def multiplier(n): return x * n return multiplier times10 = make_multiplier(10) times4 = make_multiplier(4) print(times10(5)) print(times4(23))

      ¿Pero esta vez cambiaríamos ese x * n por un x / m?

      Al revés, dividimos n / x, pero si, es relativamente similar, si no casi igual al ejercicio anterior, en concreto este reto fue puesto para que estimulemos nuestra lógica de programación, pero que gran observación!!

      Hola, me queda una duda, con estos closures se vuelve mas eficiente el programa a si yo ingreso todos los parametros a una sola funcion y hago todos los proceso alli?

      tengo la misma duda.

      la probe de la siguiente manera cambiando el string por un int

      # Hola 3 -> HolaHolaHola # Facundo 2 -> FacundoFacundo #Platzi4 -> PlatziPlatziPlatziPlatzi def make_repeater_of(n): def repeater(string): return string * n assert type(string) == str, "solo puedes pasar cadenas" return repeater def run(): repeat_5 = make_repeater_of(5) print(repeat_5(int(5))) if __name__ == '__main__': run()

      peor a la final me deolvio 2 com resultado y no aplico el assert, no que estoy haciendo mal

      Hola Jose! Si retornas la funcion antes de assert, no alcanza a tomar esa linea. Esto es porque al retornar, la funcion sencillamente finaliza (Casa que puede ser MUY util en algunos casos) Creo que este es el comportamiento que esperas

      def make_repeater_of(n): def repeater(string): assert type(string) == str, "solo puedes pasar cadenas" return string * n return repeater def run(): repeat_5 = make_repeater_of(5) print(repeat_5(int(5))) if __name__ == '__main__': run()

      Saludos!

      Ya que estamos con el tema de tipado estático en Python y retorno de funciones. Actualmente se puede especificar que el tipo de retorno en Python es una función?, por ejemplo:

      def make_repeater_of(n) -> function: def repeater(string) -> str: return string * n return repeater

      El código de arriba no funciona por si alguien lo quiere probar.

      Alguien sabe que se puede colocar en lugar de ->function?

      En este caso se puede usar el tipo Callable. Es necesario importarlo usando from typing import Callable, y se usa con la sintaxis Callable[[Arg1Type, ...], ReturnType], donde Arg1Type, ... son los tipos de los argumentos que recibe función que se retorna, y ReturnType es el tipo que retorna la función que se retorna.

      Puedes revisar más detalles en https://docs.python.org/3.9/library/typing.html#callable

      mi solucion

      def make_division_by(n: int): def division_by(numero: int): assert type(numero) == int, "Solo puedes utilizar numeros enteros" return int(numero / n) return division_by def run(): division_by_3 = make_division_by(3) print(division_by_3(18)) division_by_5 = make_division_by(5) print(division_by_5(100)) division_by_18 = make_division_by(18) print(division_by_18(54)) if __name__ == '__main__': run()

      Hola,

      La solución al problema planteado por Facundo

      def make_division_by(n): def divider(number): assert type(number) == int, "Solo puedes utilizar enteros" return number/n return divider def run(): divide_by_3 = make_division_by(3) print(divide_by_3(18)) divide_by_5 = make_division_by(5) print(divide_by_5(100)) divide_by_18 = make_division_by(18) print(divide_by_18(54)) if __name__ == '__main__': run()