<jupyter_start><jupyter_text>![Python Logo](img/Python_logo.png)Taller de Python para Profesores Taller de Python para Profesores <NAME>correos: ochoadavid at gmail.com - dochoa at iteso.mxgithub: https://github.com/ochoadavidmaterial de apoyo en: https://github.com/ochoadavid/TallerDePython<jupyter_code>from IPython.display import Image
Image(filename='img/Python_logo.png', width=800)<jupyter_output><empty_output><jupyter_text><NAME> ![Guido](img/pycon-guido.jpg)  PythonVan Rossum escribió en 1996:Hace seis años, en diciembre de 1989, estaba buscando un proyecto de programación como hobby que me mantuviera ocupado durante las semanas de Navidad. Mi oficina estaría cerrada y no tendría más que mi ordenador de casa a mano. Decidí escribir un intérprete para el nuevo lenguaje de scripting que había estado ideando recientemente: un descendiente de ABC que gustaría a los hackers de Unix/c. Elegí el nombre de Python para el proyecto, encontrándome en un estado de ánimo ligeramente irreverente (y siendo un gran fan de **Monty Python's Flying Circus**).  Programación para todosEn el año 1999 Van Rossum realizó una propuesta a DARPA llamada Computer Programming for Everybody, en la que describió qué y cómo debería ser Python: * Python debería ser fácil, intuitivo y tan potente como sus principales competidores. * El proyecto sería de Código Abierto para que cualquiera pudiera colaborar. * El código escrito en Python sería tan comprensible como cualquier texto en inglés. * Python debería ser apto para las actividades diarias permitiendo la construcción de prototipos en poco tiempo. Python es a día de hoy uno de los lenguajes de programación más populares. En 2011 se proclamó el tercer lenguaje más popular de la forja GitHub y según la encuesta se encuentra entre los 10 lenguajes de programación más demandados en las ofertas de trabajo.  El zen de Python:* Hermoso es mejor que feo.* Explícito es mejor que implícito.* Simple es mejor que complejo.* Complejo es mejor que complicado.* Sencillo es mejor que anidado.* Escaso es mejor que denso.* La legibilidad cuenta.* Los casos especiales no son lo suficientemente especiales para romper las reglas.* Lo práctico le gana a la pureza.* Los errores no deben pasar en silencio.* A menos que sean silenciados.* En cara a la ambigüedad, rechazar la tentación de adivinar.* Debe haber una - y preferiblemente sólo una - manera obvia de hacerlo.* Aunque esa manera puede no ser obvia en un primer momento a menos que seas holandés.* Ahora es mejor que nunca.* Aunque "nunca" es a menudo mejor que "ahora mismo".* Si la aplicación es difícil de explicar, es una mala idea.* Si la aplicación es fácil de explicar, puede ser una buena idea.* Los espacios de nombres son una gran idea ¡hay que hacer más de eso! ![PEP-20](img/PEP-20.png)  Programación multi-paradigmaAl igual que otros lenguajes Python es un lenguaje multiparadigma y podemos usarlo:* Con un archivo tipo script, donde el __procesamiento es lineal__ (del principio al fin).* Declarando __funciones__ que operan sobre variables.* Usando el paradigma de __programación orientada a objetos__ donde cada objeto tiene propiedades y métodos.* A manera de __conversa__ usando IPython.* Como una libreta o __notebook__ usando Jupyter.  Script:Usando un archivo de texto con el programa __ejemplo.py__:<jupyter_code>#!/usr/bin/python3
# -*- coding: utf-8 -*-
## Autor: <NAME>

print('¡Hola!')<jupyter_output>¡Hola!<jupyter_text>Funciones:<jupyter_code>def suma(a, b):
    """Suma dos valores."""
    return a + b

print(suma(5, 8))<jupyter_output>13<jupyter_text>__Nota__: en Python se utiliza la sangría (_indent_) como parte del código, determinando donde empiezan y terminan las declaraciones, ciclos y condicionales. Aunque se puede usar cualquier sangria es comunmente preferido usar una sangría de __4 espacios__ por nivel. Esto es automáticamente hecho por varios IDE y por la interfase de IPython y Jupyter.  Programación orientada a objetos:Definimos una clase:<jupyter_code>class Ventana():
    """Clase Ventana. Tiene una área definida, puede estar abierta o cerrada y puede o no 
    tener mosquitero"""
    def __init__(self, area, abierta, mosquitero = False):
        """Crea una ventana nueva. Necesita los valores del área (metros cuadrados), 
        si está abierta o no y opcionalmente se puede delcarar si tiene o no mosquitero"""
        self.area = area
        self.abierta = abierta
        self.mosquitero = mosquitero
    
    def abrir(self):
        """Abre la ventana."""
        self.abierta = True

    def cerrar(self):
        """Cierra la ventana."""
        self.abierta = False
help(Ventana)<jupyter_output>Help on class Ventana in module __main__:

class Ventana(builtins.object)
 |  Clase Ventana. Tiene una área definida, puede estar abierta o cerrada y puede o no 
 |  tener mosquitero
 |  
 |  Methods defined here:
 |  
 |  __init__(self, area, abierta, mosquitero=False)
 |      Crea una ventana nueva. Necesita los valores del área (metros cuadrados), 
 |      si está abierta o no y opcionalmente se puede delcarar si tiene o no mosquitero
 |  
 |  abrir(self)
 |      Abre la ventana.
 |  
 |  cerrar(self)
 |      Cierra la ventana.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)<jupyter_text>Y ahora creamos una instancia (objeto) tipo Ventana:<jupyter_code># Creamos la ventana_frontal:
ventana_frontal = Ventana(0.4*0.4, True)
# Utilizamos sus métodos y consultamos sus propiedades
print('La ventana frontal, ¿está abierta?')
print(ventana_frontal.abierta)
print('¿que área tiene?')
print(ventana_frontal.area)
ventana_frontal.cerrar()
print('Ahora, ¿está abierta?')
print(ventana_frontal.abierta)<jupyter_output>La ventana frontal, ¿está abierta?
True
¿que área tiene?
0.16000000000000003
Ahora, ¿está abierta?
False
{'fraction_non_alphanumeric': 0.07921451156598436, 'fraction_numerical': 0.008986520219670495, 'mean_word_length': 4.167669819432502, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '555626', 'license': 'CNRI-Python', 'n_tokens_mistral': 1998, 'n_tokens_neox': 1931, 'n_words': 758, 'path': 'Sesion 1/A-Presentacion.ipynb', 'repo_name': 'ochoadavid/TallerDePython', 'size': '6045'}