Apuntes de Python 3 (3ª parte)


Tras año y medio desde la segunda entrega de los Apuntes de Python, llega la tercera entrega, con únicamente un par de secciones bastante genéricas (comunes a muchos lenguajes de programación) y unos cuantos snippets a modo de resumen. Pero antes de nada, te recuerdo los enlaces que preceden a este post:

Guía de estilo para Python

  • Usa (4) espacios en lugar de tabular
  • Nombra a tus variables y a tus funciones en minúsculas usando «_» como separador. i.e. return_code
  • Nombra a tus constantes en mayúsculas y de nuevo, usando «_» como separador. i.e. MAX_SIZE
  • Puedes usar comillas simples o dobles para strings [Más info]
  • Para strings con triple comilla, usa siempre comillas dobles. i.e. «»» Aquí el docstring «»»
  • Usa 2 líneas en blanco antes de funciones y definiciones de clases
  • Usa 1 línea en blanco antes de métodos dentro de una clase
  • Dentro de las funciones, usa una línea en blanco para separar secciones lógicas
  • Respecto a los comentarios, deben ser frases completas. Dejando un espacio entre la almohadilla y el comentario, empezándo en mayúscula y acabando la frase con un punto.

[Más info] [Y más]

Errores de sintaxis y excepciones

Como en la mayoría de lenguajes, en Python también tendremos errores de sintaxis (aka «erratas» o «typos») y excepciones (la sentencia es sintácticamente correcta pero produce un error durante su ejecución). Para tratar excepciones, usaremos las cláusulas «try-except».

Primero, se ejecutará el código de la sección «try». Si no hay ninguna excepción no se ejecutará el código de la sección «except». Si por contra, se encuentra una excepción, el resto del código del «try» no se ejecutará y se saltará a la sección «except», siempre que la keyword de la sección coincida con el tipo de excepción. Podemos tener varias secciones «except» para un mismo «try», cada una para encargarse de un tipo de excepción diferente y opcionalmente también, una sección para encargarse de cualquier tipo de excepción que no hayamos definido antes.

try:
    # Aquí tu código.
except ValueError as e:
    print("Ops, esto no es un entero:", e.value)
except:
    print("Unexpected error", sys.exc_info()[0])
raise

[Más info] [Y más]

catch-all, else y finally

Las secciones de excepciones tipo «catch-all» se acostumbran a usar para registrar la excepción en algún log y entonces volver a lanzarla con «raise» (lo que sería un «throw» en java).

El try-except puede tener una sección adicional «else» al final, la cual se ejecuta cuando no se lanza ninguna excepción en el try. Además, también podemos tener la sección «finally» la cual se ejecutará siempre (antes de que se lance la excepción, si es que hubiera una), y suele ser usada para hacer limpieza.

Finalmente, decir que podemos crear nuestros propios tipos de excepciones definiendo nuevas clases.

Namespaces y Scope

Un namespace es un mapeo de nombre a objeto. Los namespaces nos permiten crear objetos con el mismo nombre en diferentes namespaces (local a una función, global en un módulo, built-in…)
En tiempo de ejecución, habrá por lo menos 3 scopes cuyos namespaces nos serán accesibles directamente, y en el siguiente orden de búsqueda:

  • Innermost scope: contiene los nombres locales
  • Enclosing functions scope: contiene los nombres definidos un nivel superior a donde estamos, esto es, no locales, pero tampoco globales, un nivel superior (definidas mediante la clave «nonlocal«)
  • Los nombres globales del módulo actual (definidos con «global«)
  • Outermost scope: Built-in names

Clases

Las clases en Python son similares a las de C++, y son pieza fundamental de la programación orientada a objetos. Algunas propiedades de las clases en python son:

  • Una clase puede heredar de varias clases.
  • Una clase puede llamar un método de una clase de la que hereda.
  • Una clase puede sobreescribir métodos de las clases que hereda.
  • Las clases se crean en tiempo de ejecución pero pueden modificarse tras ser creadas (monkey patching). ¡Muy útil!

Snippets a modo de resumen

# Bucles for.

for i in range(number-ops):
for file in files:

# For dictonaries.
for key, value in dict.iteritems():

# Input – array/matrix

# Number of lines to read.
n = input()
matrix = []
# Each line, one matrix row, with numbers space-separated.
for line in range(n):
   row = [int(x) for x in input().split()]
   matrix.append(row)

# While + dicts + try/except

# Number of lines to read.
phoneEntries = int(input().strip())

# Fill the dictionary
phoneBook = {}
i = 0
while i < phoneEntries:
    # Each line has a name and a phone number.
    entry = input().strip().split(' ')
    phoneBook[entry[0]] = entry[1]
    i = i + 1
    
# Queries.
while True:
    try:
        query = input()
        print(str(query + "=" + phoneBook[query]))
    except EOFError as e:
        exit(0)
    except KeyError as e:
        print("Not found")

# List comprehensions

lista-cuadrados=[x**2 for x in range(10)]
lista-positivos=[x for x in lista if x>=0]

# Helpers
Format > https://docs.python.org/3.3/library/functions.html#format

# Recursividad

i = int(input().strip())

def factorial(n):
    # Recursive.
    if n > 1:
        return(factorial(n - 1) * n)
    # Base case.
    else:
        return 1
    
print(int(factorial(i)))

Deja una respuesta

Tu dirección de correo electrónico no será publicada.