TutorialPhyton (AutoRecovered)
TutorialPhyton (AutoRecovered)
El Manual de Python
Cri
stian Sulbaran
El Manual de Python sigue la regla 80/20:
aprende el 80% del tema en el 20% del
tiempo.
Encuentro que este enfoque ofrece una descripción
bastante completa.
Resumen
Introducción a Python
Cómo instalar Python
Cómo ejecutar programas en Python
Python 2 vs Python 3
Básicos en Python
Tipos de datos en Python
Operadores en Python
El operador ternario en Python
Cadenas en Python
Booleanos en Python
Números en Python
Constantes en Python
Enums en Python
Entradas de usuario en Python
Declaraciones de control en Python
Listas en Python
Tuplas en Python
Diccionarios en Python
Conjuntos en Python
Funciones en Python
Objetos en Python
Bucles en Python
Clases en Python
Módulos en Python
Librería estándar de Python
La guía de estilo PEP8 en Python
Depurando en Python
Ámbito de variable en Python
Cómo aceptar argumentos desde la línea de
comandos en Python
Funciones Lambda en Python
Recursión en Python
Funciones anidadas en Python
Closures en Python
Decoradores en Python
Docstrings en Python
Introspección en Python
Anotaciones en Python
Excepciones en Python
Declaración with en Python
Cómo instalar paquetes de terceros en Python
usando pip
Comprensiones de lista en Python
Polimorfismo en Python
Sobrecarga de operador en Python
Entornos virtuales en Python
Conclusión
Recomendación: cuando estamos programando,
integrando palabras en nuestro idioma, suele ser mejor
evitar el uso de caracteres extendidos como las letras
con tildes(á,é,ñ,ô,ü...), para que Python, tú o la persona
usando tu código no genere errores inesperados y
lograr la menor confusión posible.
Por este motivo, dentro de los bloques especiales en
este libro que representen código, los nombres que le
demos a nuestras variables y demás objetos, NO
llevarán caracteres extendidos.
Introducción a Python
Python literalmente se está comiendo el mundo de la
programación. Está creciendo en popularidad y uso de
formas que no tienen precedentes en la historia de las
computadoras.
Python sobresale en una amplia variedad de
escenarios: las secuencias de comandos Shell, la
automatización de tareas y el desarrollo web son
solo algunos ejemplos básicos.
Python es el lenguaje preferido para data analysis y
machine learning, pero también puede adaptarse
para crear juegos y trabajar con dispositivos integrados.
Más importante aún, es el idioma elegido para las
carreras de ciencias de computación en
universidades de todo el mundo.
Muchos estudiantes aprenden Python como su primer
lenguaje de programación. Muchos lo están
aprendiendo ahora mismo y muchos más lo aprenderán
en el futuro. Y para muchos de ellos, Python será el
único lenguaje de programación que necesitarán.
nombre = "Flavio"
y luego imprime su valor, usando print():
print(nombre)
./program.py
edad = 8
Un nombre de variable puede estar compuesto por
caracteres, números y el carácter de subrayado _. No
puede empezar con un número. Todos estos son
nombres de variables válidos:
nombre1
EDAD
eDAD
a11111
mi_nombre
_nombre
Estos son nombres de variables inválidos:
123
prueba!
nombre%
Aparte de eso, cualquier cosa es válida a menos que
sea una palabra clave de Python. Hay algunas
palabras clave como for, if, while, import y más.
No es necesario memorizarlos, ya que Python te
alertará si usas uno de ellos como variable, y los
reconocerás gradualmente como parte de la sintaxis del
lenguaje de programación Python.
nombre = "Roger"
print(nombre)
Un programa está formado por una serie de
declaraciones. Cada declaración se coloca en su propia
línea, pero puedes usar un punto y coma para tener
más de una declaración en una sola línea:
Indentación en Python
La indentación en Python es significativa.
nombre = "Flavio"
print(nombre)
Algunos otros lenguajes no tienen espacios en blanco
significativos, pero en Python, el indentado es
importante.
nombre = "Flavio"
edad = 20
Python detecta automáticamente el tipo a partir del tipo
de valor.
nombre = str("Flavio")
otroNombre = str(nombre)
También puedes convertir de un tipo a otro utilizando el
constructor de clases. Python intentará determinar el
valor correcto, por ejemplo, extrayendo un número de
una cadena:
edad = int("20")
print(edad) #20
fraccion = 0.1
fraccionEntera = int(fraccion)
print(fraccionEntera) #0
A esto se le llama casting. Por supuesto, es posible que
esta conversión no siempre funcione según el valor
pasado. Si escribes prueba en lugar de 20 en la cadena
anterior, obtendrás unValueError: invalid literal for int() with base
10: 'prueba'.
Esos son solo los conceptos básicos de los tipos.
Tenemos muchos más tipos en Python:
complex para números complejos
bool para booleanos(verdadero/falso)
list para listas
tuple para tuplas
range para rangos
dict para diccionarios
set para conjuntos(sets)
¡y más!
Operadores en Python
Los operadores de Python son símbolos que usamos
para ejecutar operaciones sobre valores y variables.
Podemos dividir los operadores en función del tipo de
operación que realizan:
Operador de asignación
Operadores aritméticos
Operadores de comparación
Operadores lógicos
Operadores bit a bit
además de algunos interesantes como is e in.
Operador de asignación en Python
El operador de asignación se utiliza para asignar un
valor a una variable:
edad = 8
O para asignar un valor de variable a otra variable:
edad = 8
otraVariable = edad
Desde Python 3.8, el operador walrus(morsa) := se
usa para asignar un valor a una variable como parte de
otra operación. Por ejemplo, dentro de un if o en la
parte condicional de un bucle. Más sobre eso luego.
Operadores aritméticos en Python
Python tiene varios operadores
aritméticos: +,-, , / (división), %(resto), *
*(exponenciación) y // (división de piso):
1 + 1 #2
2 - 1 #1
2 * 2 #4
4 / 2 #2
4 % 3 #1
4 ** 2 #16
4 // 2 #2
Ten en cuenta que no necesitas un espacio entre los
operandos, pero es bueno para la legibilidad.
- también funciona como un operador unario negativo:
print(-4) #-4
+ también se usa para concatenar valores de cadena:
"Roger" + " es un buen perro"
#Roger es un buen perro
Podemos combinar el operador de asignación con
operadores aritméticos:
+=
-=
*=
/=
%=
...y así
Ejemplo:
edad = 8
edad += 1
#edad es ahora 9
==
!=
>
<
>=
<=
Puedes usar esos operadores para obtener un valor
booleano (True o False) según el resultado:
a = 1
b = 2
a == b #False
a != b #True
a > b #False
a <= b #True
not
and
or
Cuando se trabaja con atributos True o False, estos
funcionan como "Y", "O" y "NO" lógicos, y a menudo se
usan en la evaluación de la expresión condicional if:
condicion1 = True
condicion2 = False
is e in en Python
isse llama el operador de identidad. Se utiliza para
comparar dos objetos y devuelve verdadero si ambos
son el mismo objeto. Más sobre objetos luego.
inse llama el operador de membresía. Se utiliza para
saber si un valor está contenido en una lista o en otra
secuencia. Más sobre listas y otras secuencias luego.
El operador ternario en Python
El operador ternario en Python permite definir
rápidamente un condicional.
def es_adulto(edad):
if edad > 18:
return True
else:
return False
Puedes implementarlo con el operador ternario de esta
manera:
def es_adulto(edad):
return True if edad > 18 else False
Primero defines el resultado si la condición es
verdadera, luego evalúas la condición, luego defines el
resultado si la condición es falsa:
Cadenas en Python
Una cadena en Python es una serie de caracteres entre
comillas o comillas dobles:
"Roger"
'Roger'
Puedes asignar un valor de cadena a una variable:
nombre = "Roger"
Puedes concatenar dos cadenas usando el operador +:
frase = "Roger" + " es un buen perro"
Puedes agregar a una cadena usando +=:
nombre = "Roger"
nombre += " es un buen perro"
print("""Roger tiene
a_os de edad
""")
print('''
Roger tiene
8
a_os de edad
''')
Una cadena tiene un conjunto de métodos integrados,
como:
nombre = "Roger"
print(nombre.lower()) #"roger"
print(nombre) #"Roger"
También puedes usar algunas funciones globales para
trabajar con cadenas.
nombre = "Roger"
"Ro"Ger"no funcionará, ya que Python pensará que la
cadena termina en "Ro".
El camino a seguir es hacer escapar a a las comillas
dobles dentro de la cadena, con el carácter \ (barra
invertida):
nombre = "Ro\"ger"
#"Ro"ger"
Esto también se aplica a las comillas simples \' y a los
caracteres de formateo especial como \t para
tabulación, \n para nueva línea y \\ para la barra
invertida.
Dada una cadena, puedes obtener sus caracteres
usando corchetes cuadrados para obtener un elemento
específico, dado su índice, comenzando desde cero [0]:
nombre = "Roger"
nombre[0] #'R'
nombre[1] #'o'
nombre[2] #'g'
El uso de un número negativo comenzará a contar
desde el final:
nombre = "Roger"
nombre[-1] #"r"
También puedes usar un rango, usando lo que
llamamos rebanar(slicing):
nombre = "Roger"
nombre[0:2] #"Ro"
nombre[:2] #"Ro"
nombre[2:] #"ger"
Booleanos en Python
Python proporciona el tipo bool , que puede tener dos
valores: True (Verdadero) y False (Falso) (capitalizado).
hecho = False
hecho = True
Los booleanos son especialmente útiles con estructuras
de control condicionales como declaraciones if :
hecho = True
if hecho:
# Ejecuta algun codigo
else:
# Ejecuta algun otro codigo
Al evaluar un valor para True o False, si el valor no es
un bool , tenemos algunas reglas dependiendo del tipo
que estemos verificando:
los números son siempre True excepto el número 0,
las cadenas son False solo cuando están vacías '',
las listas, tuplas, conjuntos y diccionarios
son False solo cuando están vacíos.
Puedes verificar si un valor es booleano de esta
manera:
hecho = True
type(hecho) == bool #True
O usando isinstance(), pasando 2 argumentos: la variable
y la clase bool :
hecho = True
isinstance(hecho, bool) #True
La función global any() también es muy útil cuando se
trabaja con valores booleanos, ya que
devuelve True si alguno de los valores del iterable
(lista, por ejemplo) pasado como argumento es True :
libro_1_leido = True
libro_2_leido = False
Números en Python
Los números en Python pueden ser de 3
tipos: int, float y complex.
Números enteros en Python
Los números enteros se representan mediante la
clase int . Puedes definir un entero mediante un valor
literal:
edad = 8
También puedes definir un número entero usando el
constructor int():
edad = int(8)
Para comprobar si una variable es de tipo int, puedes
utilizar la función global type():
type(edad) == int #True
numeroComplejo = 2+3j
o usando el constructor complex():
numeroComplejo = complex(2, 3)
Una vez que tengas un número complejo, puedes
obtener su parte real e imaginaria:
numeroComplejo.real #2.0
numeroComplejo.imag #3.0
Nuevamente, para verificar si una variable es de
tipo complex, puedes usar la función global type():
type(numeroComplejo) == complex #True
+=
-=
*=
/=
%=
y así...
para realizar rápidamente operaciones en variables,
también:
edad = 8
edad += 1
round(0.12, 1) #0.1
Varias otras funciones de utilidad matemática y
constantes son proporcionadas por la biblioteca
estándar de Python:
Constantes en Python
Python no tiene forma de exigir que una variable sea
una constante.
class Constantes(Enum):
ANCHURA = 1024
ALTURA = 256
Y obtener cada valor usando, por
ejemplo, Constantes.ANCHURA.value.
Nadie puede reasignar ese valor.
Enums en Python
Los Enums son nombres legibles que están vinculados a
un valor constante.
Para usar Enums, importa Enum desde el módulo de
biblioteca estándar enum:
from enum import Enum
Luego puedes inicializar un nuevo Enum de esta manera:
class Estado(Enum):
INACTIVO = 0
ACTIVO = 1
Una vez que lo hagas, puedes hacer referencia
a Estado.INACTIVO y Estado.ACTIVO, y sirven como
constantes.
Ahora, si intentas imprimir Estado.ACTIVO, por ejemplo:
print(Estado.ACTIVO)
no devolverá 1, sino Estado.ACTIVO.
El mismo valor puede ser alcanzado por el número
asignado en el
enum: print(Estado(1)) devolverá Estado.ACTIVO. Lo mismo
para usar la notación de corchetes Estado['ACTIVO'].
Sin embargo, puedes obtener el valor mediante
Estado.ACTIVO.value.
Puedes enlistar todos los valores posibles de un enum:
len(Estado) # 2
if condicion == True:
# Hace algo
Cuando la prueba de condición se resuelve en True,
como en el caso anterior, el bloque se ejecuta.
¿Qué es un bloque? Un bloque es la parte que tiene una
indentación de un nivel (normalmente 4 espacios) a la
derecha.
condicion = True
if condicion == True:
print("La condicion")
print("era VERDADERA")
El bloque puede estar formado por una sola línea, o
también por varias líneas, y termina cuando regresa al
nivel de indentación anterior:
condicion = True
if condicion == True:
print("La condicion")
print("era VERDADERA")
if condicion == True:
print("La condicion")
print("era VERDADERA")
else:
print("La condicion")
print("era FALSA")
Y puedes tener diferentes verificaciones
vinculadas if con elif que se ejecutan si la verificación
anterior fue falsa:
condicion = True
nombre = "Roger"
if condicion == True:
print("La condicion")
print("era VERDADERA")
elif nombre == "Roger":
print("Hola Roger")
else:
print("La condicion")
print("era FALSA")
En este caso, el segundo bloque se ejecuta
si condicion es False y el valor de la variable nombre es
"Roger".
En una declaración if, puedes tener solo una
verificación if y else, pero varias series de
verificaciones elif:
condicion = True
nombre = "Roger"
if condicion == True:
print("La condicion")
print("era VERDADERA")
elif nombre == "Roger":
print("Hola Roger")
elif nombre == "Syd":
print("Hola Syd")
elif nombre == "Flavio":
print("Hola Flavio")
else:
print("La condicion")
print("era FALSA")
ify else también se pueden usar en un formato en-línea,
lo que nos permite devolver un valor u otro en función
de una condición.
Ejemplo:
a = 2
resultado = 2 if a == 0 else 3
print(resultado) # 3
Listas en Python
Las listas son una estructura de datos esencial de
Python.
Por ejemplo:
items[0] # "Roger"
items[1] # 1
items[3] # True
Usando la misma notación, puedes cambiar el valor
almacenado en un índice específico:
items[0] = "Roger"
También puedes utilizar el método index():
items.index(0) # "Roger"
items.index(1) # 1
Al igual que con las cadenas, el uso de un índice
negativo comenzará a buscar desde el final:
items[-1] # True
También puedes extraer una parte de una lista,
utilizando porciones(slices):
items[0:2] # ["Roger", 1]
items[2:] # ["Syd", True]
Obtén el número de elementos contenidos en una lista
usando la función global len(), la misma que usamos
para obtener la longitud de una cadena:
len(items) #4
Puedes agregar elementos a la lista mediante el
método append():
items.append("Prueba")
o el método extend()
items.extend(["Prueba"])
También puedes utilizar el operador +=:
items += ["Prueba"]
# los items son ['Roger', 1, 'Syd', True, 'Prueba']
Consejo: con extend() o += no olvides los corchetes. No
hagas items += "Prueba" or items.extend("Prueba") o Python
agregará 6 caracteres individuales a la lista, lo que dará
como resultado ['Roger', 1, 'Syd', True, 'P', 'r', 'u', 'e', 'b', 'a']
Elimina un elemento usando el método remove():
items.remove("Prueba")
Puedes agregar varios elementos usando
#o
Tuplas en Python
Las tuplas son otra estructura de datos fundamental de
Python.
nombres[0] # "Roger"
nombres[1] # "Syd"
También puedes usar el método index() :
nombres.index('Roger') # 0
nombres.index('Syd') #1
Al igual que con las cadenas y las listas, el uso de un
índice negativo comenzará a buscar desde el final:
nombres[-1] # True
Puedes contar los elementos en una tupla con la
función len():
len(nombres) # 2
Puedes verificar si un elemento está contenido en una
tupla con el operador in:
print("Roger" in nombres) # True
También puedes extraer una parte de una tupla,
utilizando porciones(slices):
nombres[0:2] # ('Roger', 'Syd')
nombres[1:] # ('Syd',)
Puedes crear una versión ordenada de una tupla
usando la función global sorted():
sorted(nombres)
Puedes crear una nueva tupla a partir de tuplas
utilizando el operador +:
nuevaTupla = nombres + ("Vanille", "Tina")
Diccionarios en Python
Los diccionarios son una estructura de datos de Python
muy importante.
perro['nombre'] = 'Syd'
Y otra forma es usar el método get(), que tiene una
opción para agregar un valor predeterminado:
perro.get('nombre') # 'Roger'
perro.get('prueba', 'predeterminado') # 'predeterminado'
El método pop() recupera el valor de una clave y,
posteriormente, elimina el elemento del diccionario.
perro.pop('nombre') # 'Roger'
El método popitem() recupera y elimina el último par
clave/valor insertado en el diccionario:
perro.popitem()
Puedes verificar si una clave está contenida en un
diccionario con el operador in:
'nombre' in perro # True
Obtén una lista con las claves en un diccionario usando
el método keys(), pasando su resultado al
constructor list():
list(perro.keys()) # ['nombre', 'edad']
Obtén los valores usando el método values() y las tuplas
de pares clave/valor usando el método items():
print(list(perro.values()))
# ['Roger', 8]
print(list(perro.items()))
# [('nombre', 'Roger'), ('edad', 8)]
Obtén la longitud de un diccionario usando la función
global len(), la misma que usamos para obtener la
longitud de una cadena o los elementos de una lista:
len(perro) #2
Puedes agregar un nuevo par clave/valor al diccionario
de esta manera:
Conjuntos en Python
Los conjuntos(sets) son otra estructura de datos
importante de Python.
Podemos decir que funcionan como tuplas, pero no
están ordenadas y son mutables.
O podemos decir que funcionan como diccionarios, pero
no tienen claves.
Funciones en Python
Una función nos permite crear un conjunto de
instrucciones que podemos ejecutar cuando sea
necesario.
def hola(nombre):
print('Hola ' + nombre + '!')
En este caso llamamos a la función pasando el
argumento
hola('Roger')
Llamamos parámetros a los valores aceptados por la
función dentro de la definición de la función, y
argumentos a los valores que pasamos a la función
cuando la llamamos. Es común confundirse con esta
distinción.
Un argumento puede tener un valor predeterminado
que se aplica si no se especifica el argumento:
hola()
# Hola mi amigo!
Así es como podemos aceptar múltiples parámetros:
hola('Roger', 8)
Los parámetros se pasan por referencia. Todos los tipos
en Python son objetos, pero algunos de ellos son
inmutables, incluidos enteros, booleanos, flotantes,
cadenas y tuplas. Esto significa que si los pasas como
parámetros y modificas su valor dentro de la función, el
nuevo valor no se refleja fuera de la función:
def cambio(valor):
valor = 2
val = 1
cambio(val)
print(val) #1
Si pasas un objeto que no es inmutable y cambia una
de sus propiedades, el cambio se reflejará en el
exterior.
def hola(nombre):
print('Hola ' + nombre + '!')
return
Podemos tener la declaración de retorno dentro de un
condicional, que es una forma común de finalizar una
función si no se cumple una condición inicial:
def hola(nombre):
if not nombre:
return
print('Hola ' + nombre + '!')
Si llamamos a la función pasando un valor que se
evalúa como False, como una cadena vacía, la función
finaliza antes de llegar a la declaración print().
Puedes devolver varios valores utilizando valores
separados por comas:
def hola(nombre):
print('Hola ' + nombre + '!')
return nombre, 'Roger', 8
En este caso, al llamar a hola('Syd'), el valor de retorno es
una tupla que contiene esos 3 valores: ('Syd', 'Roger', 8).
Objetos en Python
Todo en Python es un objeto.
print(edad.real) # 8
print(edad.imag) # 0
print(edad.bit_length()) #4
items = [1, 2]
items.append(3)
items.pop()
Los métodos dependen del tipo de valor.
La función global id() proporcionada por Python permite
inspeccionar la ubicación en la memoria de un objeto
en particular
id(edad) # 140170065725376
Tu valor de memoria cambiará, solo lo muestro como
un ejemplo.
Si asignas un valor diferente a la variable, su dirección
cambiará, porque el contenido de la variable ha sido
reemplazado por otro valor almacenado en otra
ubicación de la memoria:
edad = 8
print(id(edad)) # 140535918671808
edad = 9
print(id(edad)) # 140535918671840
Pero si modificas el objeto usando sus métodos, la
dirección permanece igual:
items = [1, 2]
print(id(items)) # 140093713593920
items.append(3)
print(items) # [1, 2, 3]
print(id(items)) # 140093713593920
La dirección solo cambia si reasignas una variable a
otro valor.
#o
edad += 1
y verificas con id(edad), encontrarás que la edad apunta
a una ubicación de memoria diferente. El valor original
no ha cambiado, simplemente cambiamos a otro valor.
Bucles en Python
Los bucles son una parte esencial de la programación.
contador = 0
while contador < 10:
print("La condicion es verdadera")
contador = contador + 1
items = [1, 2, 3, 4]
for item in items:
print(item)
O puedes iterar una cantidad específica de veces
usando la función range():
for item in range(04):
print(item)
range(4)creauna secuencia que comienza desde 0 y
contiene 4 elementos: [0, 1, 2, 3].
Para obtener el índice, debes ajustar la secuencia en la
función enumerate():
items = [1, 2, 3, 4]
for indice, item in enumerate(items):
print(indice, item)
Clases en Python
Además de usar los tipos proporcionados por Python,
podemos declarar nuestras propias clases y, a partir de
las clases, podemos crear instancias de objetos.
Un objeto es una instancia de una clase. Una clase es el
tipo de objeto.
class <nombre_clase>:
# mi clase
Por ejemplo, definamos una clase Perro:
class Perro:
# la clase Perro
Una clase puede definir métodos:
class Perro:
# la clase Perro
def ladrido(self):
print('Guau!')
selfya que el argumento del método apunta a la
instancia del objeto actual y debe especificarse al
definir un método.
Creamos una instancia de una clase, un objeto,
usando esta sintaxis:
roger = Perro()
Ahora roger es un nuevo objeto de tipo Perro.
Si ejecutas:
print(type(roger))
Obtendrás <class '__main__.Perro'>
Un tipo especial de método, __init__() se
llama constructor, y podemos usarlo para inicializar
una o más propiedades cuando creamos un nuevo
objeto de esa clase:
class Perro:
# la clase Perro
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def ladrido(self):
print('Guau!')
La usamos de esta manera:
roger = Perro('Roger', 8)
print(roger.nombre) # 'Roger'
print(roger.edad) #8
roger.ladrido() # 'Guau!'
Una característica importante de las clases es
la herencia.
Podemos crear una clase Animal con un método caminar():
class Animal:
def caminar(self):
print('Caminando..')
y la clase Perro puede heredar de Animal:
class Perro(Animal):
def ladrido(self):
print('Guau!')
Ahora, la creación de un nuevo objeto de la
clase Perro tendrá el método caminar(), ya que se hereda
de Animal:
roger = Perro()
roger.caminar() # 'Caminando..'
roger.ladrido() # 'Guau!'
Módulos en Python
Cada archivo de Python es un módulo.
perro.ladrido()
O podemos usar la sintaxis from ... import y llamar a la
función directamente:
from perro import ladrido
ladrido()
La primera estrategia nos permite cargar todo lo
definido en un archivo.
perro.ladrido()
o puedes hacer referencia a la función específica del
módulo de perro que se importa desde lib.perro:
from lib.perro import ladrido
ladrido()
import math
math.sqrt(4) # 2.0
ó
sqrt(4) # 2.0
Pronto exploraremos los módulos más importantes de
forma individual para comprender qué podemos hacer
con ellos.
breakpoint()
Puedes agregar más puntos de interrupción si es
necesario.
Cuando el intérprete de Python llegue a un punto de
interrupción en tu código, se detendrá y te dirá cuál es
la siguiente instrucción que ejecutará.
edad = 8
def prueba():
print(edad)
print(edad) # 8
prueba() # 8
Lo llamamos variable global.
Si defines una variable dentro de una función, esa
variable es una variable local y solo es visible dentro
de esa función. Fuera de la función, no es accesible:
def prueba():
edad = 8
print(edad)
prueba() # 8
print(edad)
# # # NameError: name 'edad' is not defined
# Error: el nombre 'edad' no está definido
python <nombre_de_archivo>.py
Puedes pasar argumentos y opciones adicionales
cuando lo hagas, como este:
parser = argparse.ArgumentParser(
description='Este programa imprime los nombres de mis perros'
)
Luego procedes a agregar los argumentos que deseas
aceptar, por ejemplo en este programa aceptamos una
opción -c para pasar un color, así:
python program.py -c red
import argparse
parser = argparse.ArgumentParser(
description='Este programa imprime un valor de color HEX'
)
print(args.color) # 'red'(rojo)
Si no se especifica el argumento, el programa genera
un error:
#programa.py: error: argumentp -c/--color: opcion invalida: 'blue' (elija entre 'yellow', 'red')
Hay más opciones, pero esas son las básicas.
lambda a, b : a * b
Las funciones de Lambda no se pueden invocar
directamente, pero puedes asignarlas a variables:
multiplicar = lambda a, b : a * b
print(multiplicar(2, 2)) # 4
La utilidad de las funciones lambda viene cuando se
combina con otras funciones de Python, por ejemplo en
combinación con map(), filter() y reduce().
Recursión en Python
Una función en Python puede llamarse a sí misma. Eso
es la recursividad. Y puede ser bastante útil en muchos
escenarios.
def factorial(n):
if n == 1: return 1
return n * factorial(n-1)
print(factorial(3)) # 6
print(factorial(4)) # 24
print(factorial(5)) # 120
Si dentro de la función factorial() llamas a factorial(n) en
lugar de factorial(n-1), vas a provocar una recursión
infinita. Python, de forma predeterminada detendrá las
recursiones en 1000 llamadas, y cuando se alcance
este límite, obtendrás un error RecursionError.
La recursividad es útil en muchos lugares y nos ayuda a
simplificar nuestro código cuando no hay otra forma
óptima de hacerlo, por lo que es bueno conocer esta
técnica.
def hablar(frase):
def decir(palabra):
print(palabra)
def incrementar():
nonlocal conteo
conteo = conteo + 1
print(conteo)
incrementar()
conteo()
Esto es útil especialmente con closures, como veremos
a continuación.
Closures en Python
Si devuelves una función anidada de una función, esa
función anidada tiene acceso a las variables definidas
en esa función, incluso si esa función ya no está activa.
def contador():
conteo = 0
def incrementar():
nonlocal conteo
conteo = conteo + 1
return conteo
return incrementar
incrementar = contador()
print(incrementar()) # 1
print(incrementar()) # 2
print(incrementar()) # 3
Devolvemos la función interna incrementar(), que todavía
tiene acceso al estado de la variable conteo aunque la
función contador() haya finalizado.
Decoradores en Python
Los decoradores son una forma de cambiar, mejorar o
alterar de cualquier forma el funcionamiento de una
función.
def registro(func):
def envoltura():
# hace algo antes
val = func()
# hace algo después
return val
return envoltura
Docstrings en Python
La documentación es muy importante, no solo para
comunicar a otras personas cuál es el objetivo de una
función / clase / método / módulo, sino que también te
lo comunicas a ti mismo.
# esto es un comentario
num = 1 # esto es otro comentario
Otra forma es utilizar docstrings(cadenas de
documentación).
La utilidad de las docstrings es que siguen
convenciones. Como tales, pueden procesarse
automáticamente.
Así es como se define una docstring para una función:
def incrementar(n):
"""Incrementa un numero"""
return n + 1
Así es como se define una docstring para una clase y un
método:
class Perro:
"""Una clase que representa un perro"""
def __init__(self, nombre, edad):
"""Inicializar un nuevo perro"""
self.nombre = nombre
self.edad = edad
def ladrido(self):
"""Permite ladrar al perro"""
print('WOF!')
Documenta un módulo colocando una cadena de
documentos en la parte superior del archivo, por
ejemplo, suponiendo que se trata de perro.py:
"""Modulo Perro
Este modulo hace ... bla bla bla y provee las siguientes clases:
- Perro
...
"""
class Perro:
"""Una clase que representa un perro"""
def __init__(self, nombre, edad):
"""Inicializar un nuevo perro"""
self.nombre = nombre
self.edad = edad
def ladrido(self):
"""Permite ladrar al perro"""
print('WOF!')
def incrementar(n):
"""Incrementa
un numero
"""
return n + 1
Python los procesará, y puedes usar la función
global help() para obtener la documentación de una
clase/método/función/módulo.
Por ejemplo, llamar a help(incrementar) te dará esto:
#Help on function incrementar in module __main__:
#Ayuda en función incrementar en el modulo __main__:
incrementar(n)
Incrementa
un número
Hay muchos estándares diferentes para formatear
docstrings, y puedes elegir adherirte a tu favorito.
Me gusta el estándar de
Google(inglés): https://github.com/google/styleguide/blo
b/gh-pages/pyguide.md#38-comments-and-docstrings
Los estándares permiten tener herramientas para
extraer docstrings y generar automáticamente
documentación para tu código.
Introspección en Python
Las funciones, variables y objetos se pueden analizar
mediante la introspección.
print(incrementar)
class Perro():
def ladrido(self):
print('WOF!')
roger = Perro()
print(roger)
print(type(1))
# <class 'int'>
print(type('test'))
# <class 'str'>
La función global dir() nos permite conocer todos los
métodos y atributos de un objeto:
print(dir(roger))
def incrementar(n):
return n + 1
Esta es la misma función con anotaciones:
conteo: int = 0
Python ignorará esas anotaciones. Una herramienta
separada llamada mypy se puede ejecutar de forma
independiente o integrada por IDE como VS Code o
PyCharm, para verificar automáticamente los errores
de tipo de forma estática, mientras estás
programando. También te ayudará a detectar errores
de discrepancia de tipos incluso antes de ejecutar el
código.
Una gran ayuda, especialmente cuando tu software se
vuelve grande y necesitas refactorizar el código.
Excepciones en Python
Es importante tener una forma de manejar los errores,
y Python nos brinda un manejo de excepciones para
hacerlo.
resultado = 2 / 0
print(resultado)
El programa terminará con un error:
print(resultado) # 1
También puedes generar excepciones en tu propio
código, utilizando la declaración raise:
raise Exception('Ha ocurrido un error!')
Esto genera una excepción general y puedes
interceptarla usando:
try:
raise Exception('Ha ocurrido un error!')
except Exception as error:
print(error)
También puedes definir tu propia clase de excepción,
desde Exception:
class PerroNoEncontradoExcepcion(Exception):
pass
passaquí significa "nada" y debemos usarlo cuando
definimos una clase sin métodos, o una función sin
código también.
try:
raise PerroNoEncontradoExcepcion()
except PerroNoEncontradoExcepcion:
print('Perro no encontrado!')
nombre = '/Users/flavio/prueba.txt'
try:
archivo = open(nombre, 'r')
contenido = archivo.read()
print(contenido)
finally:
archivo.close()
Puedes escribir:
nombre = '/Users/flavio/prueba.txt'
numeros = [1, 2, 3, 4, 5]
Puedes crear una nueva lista usando una comprensión
de lista, compuesta por los elementos de la lista
de números, elevados a 2:
numeros_elevados_a_2 = [n**2 for n in numeros]
# [1, 4, 9, 16, 25]
Las comprensiones de lista son una sintaxis que a veces
se prefiere a los bucles, ya que es más legible cuando
la operación se puede escribir en una sola línea:
numeros_elevados_a_2 = []
for n in numeros:
numeros_elevados_a_2.append(n**2)
y sobre map():
numeros_elevados_a_2 = list(map(lambda n : n**2, numeros))
Polimorfismo en Python
El polimorfismo generaliza una funcionalidad para que
pueda funcionar en diferentes tipos. Es un concepto
importante en la programación orientada a objetos.
class Perro:
def comer():
print('Comiendo comida de perro')
class Gato:
def comer():
print('Comiendo comida de gato')
Luego podemos generar objetos y podemos llamar al
método comer() independientemente de la clase a la que
pertenezca el objeto, y obtendremos resultados
diferentes:
animal1 = Perro()
animal2 = Gato()
animal1.comer()
animal2.comer()
Creamos una interfaz generalizada y ahora no
necesitamos saber que un animal es un Gato o un Perro.
class Perro:
# la clase Perro
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
Creemos 2 objetos Perro:
roger = Perro('Roger', 8)
syd = Perro('Syd', 7)
Podemos usar la sobrecarga de operadores para
agregar una forma de comparar esos 2 objetos, según
la propiedad edad:
class Perro:
# la clase Perro
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def __gt__(self, otro):
return True if self.edad > otro.age else False
Ahora, si intentas ejecutar print(roger > syd) obtendrás el
resultado True.
De la misma manera que definimos __gt__() (que
significa mayor que), podemos definir los siguientes
métodos:
__eq__() para comprobar la igualdad
__lt__() para comprobar si un objeto debe
considerarse menor que otro con el operador <
__le__() para menor o igual (<=)
__ge__() para mayor o igual (>=)
__ne__() para no igual (!=)
Entonces tienes métodos para interoperar con
operaciones aritméticas:
Entonces ejecuta
source .venv/bin/activate
Usa source .venv/bin/activate.fish en Fish shell
La ejecución del programa activará el entorno virtual de
Python. Dependiendo de tu configuración, es posible
que también veas un cambio en el indicador de tu
terminal.
El mío cambió de
➜ carpeta
a
(.venv) ➜ carpeta
Ahora, la ejecución de pip utilizará este entorno virtual
en lugar del entorno global.
Conclusión
Muchas gracias por leer este libro.
If you read this far, thank the author to show them you
care. Say Thanks
Aprende a codificar de forma gratuita. El plan de
estudios de código abierto de freeCodeCamp ha
ayudado a más de 40,000 personas a obtener trabajos
como desarrolladores. Empezar
ANUNCIO
Our mission: to help people learn to code for free. We accomplish this by
creating thousands of videos, articles, and interactive coding lessons - all
freely available to the public.
Guías de tendencias
Git CloneMétodos AgilePython MainCallbackDebounceURL EncodeBlink
HTMLPython TuplaJavaScript PushJava List
UXProceso de DiseñoNúmeros PrimosDiseño de ProductoDigital DesignJuegos
de CódigoSVMJavaScript forEachGoogle BERTCreate Table SQL
Diseño Web Responsive¿Qué es un archivo SVG?PDF Password Remover¿Qué
es un Archivo PDF?What Is Python?
¿Qué es TLS?¿Qué es una red LAN?¿Qué es npm?Ejemplos de RSyncRandom
Forest
Acerca deRed de ex-AlumnosCódigo
abiertoTiendaSoportePatrocinadoresHonestidad AcadémicaCódigo de
ConductaPolítica de privacidadTérminos de servicioPolítica de derechos de
autor