Vistas: 815
Tiempo de lectura:4 Minutos, 36 Segundos

Todo comenzó a partir de leer un libro, que la verdad recomiendo mucho ya que es muy explicativo y sencillo para el usuario novato de python.  Muchos de los trucos expuestos aquí, puedes encontrarlo en este libro.

1. La expresión Lambda

La librería estándar de python provee una manera de declarar funciones anónimas o funciones de una línea. Las funciones lambda se comportan de la misma manera que una función regular declarada con la keyword “def”.

Podemos definir funciones o expresiones de una sola línea, de manera que no sea necesario escribir una función regular, de esta manera ahorramos líneas en nuestros proyectos al tratar de ejecutar pequeñas sentencias como el siguiente ejemplo.

Expresión Lambda

>>> add = lambda x, y: x + y
>>> add(5, 3)
8

Expresión Regular

>>> def add(x, y):
…          return x + y
>>> add(5, 3)
8

Solo tienes que recordar que esta herramienta está restringida a retornar el resultado de una única expresión, por lo que está prohibido hacer anotaciones y declaraciones dentro de esta.

2. Dictionary Default Values

Todos conocemos y usamos los diccionarios de python, son estructuras excelentes para almacenar un número arbitrario de objetos, cada uno identificado por una clave de diccionario única. Pero qué pasa cuando intentamos acceder a un valor que no existe dentro del diccionario.

Por ejemplo, tenemos este diccionario y una función para saludar según el código del nombre:

nombres = {300:'Alice', 301:'Bob', 302:'Louise'}
def  hola(code):
    return 'Hola %s!' % nombres[code]

Al acceder a un código que no existe nos arrojará un error:

>>>hola(382)
'Hola Louise!'

>>>hola(33333333)
KeyError: 33333333

Una solución para esto sería comprobar si el código está en el diccionario, o con una sentencia try/catch para manejar el error de clave.

#Sentencia try/catch
def hola(code):
    try:
        return 'Hola %s!' % nombres[code]
    except KeyError:
        return 'Hola como va todo'
/////////////////////////////////////////////////////////
#Comprobar que existe en el diccionario
def hola(code):
    if code in nombres:
        return 'Hola %s!' % nombres[code]
    else:
        return 'Hola como va todo!'

Pero hay una soucion mas sencilla y con mucho menos código, que ya viene implementada dentro del objeto dict.

def hola(code):
    return 'Hola %s!' % nombres.get(code, 'como va todo')

El método get, recibe la clave y a su vez un valor por defecto que retornara si no encuentra el primer parámetro.

3. Emular Switch/Case con Diccionarios

En otros lenguajes como C, conocemos la sentencia  Switch/Case, algo muy útil para comprimir nuestros algoritmos, pero tal sentencia no existe dentro de python, entonces nos fuerza tener una cadena larga de  if…elif…else… 

Esta sencilla estructura, mezclando expresiones lambda, un diccionario y sus valores por defecto, nos evitará caer en los if anidados.

def switch_case_dict(operator, x, y):
    return {
        'add': lambda: x + y,
        'sub': lambda: x - y,
        'mul': lambda: x * y,
        'div': lambda: x / y,
    }.get(operator, lambda: None)()

Este switch/case con diccionario, en particular solo opera entre dos números según el tipo de operación que especifiquemos, y está preparado para retornar un None si no se especifica correctamente la operación.

>>> switch_case_dict('mul', 2, 8)
16
>>> switch_case_dict('unknown', 2, 8)
None

4. Ocultar el password al pedirlo por consola

Una manera de ocultar los caracteres al pedir datos sensibles por consola en nuestras aplicaciones, es usando el módulo getpass de la librería estándar, es un truco muy sencillo que nos permitirá introducir contraseñas o cualquier otro dato que no queramos que se vea en pantalla.

usuario = input("Introduce usuario: ")
password = getpass.getpass("Introduce password: ")
print(usuario, password)

5. Explorar los módulos

Seguro que muchos conocen la función dir(), es un método de la librería estándar que nos permite ver dentro de los objetos, las variables y métodos que contiene, pero, ¿ alguna vez lo han usado para ver dentro de los módulos?. Al explorar dentro de un módulo o paquete de python podemos descubrir todos los métodos que contiene, al igual que podemos hacerlo explorando dentro de ellos hasta el final de la cadena.

Explorando el modulo Collections con dir()

6. Iniciar un servidor estático en directorio local

Este es uno de esos trucos que nunca sabes si vas a utilizar, pero puedes iniciar un servidor local estático con una simple línea de código en la consola.

# En Mac y Linux 
python -m SimpleHTTPServer

 #Windows 
python -m http.server

Este servidor iniciará en la ruta donde ejecutes el código.

7. Colas y Pilas más rápidas (Fastest Queue and Stacks)

Cuando programamos tratamos de ser lo más eficiente en cuanto al uso de recursos, tiempo de ejecución y consumo de memoria. Este es uno de esos casos donde dos elementos que a priori sirven para lo mismo, uno es más eficiente que otro. Estoy hablando de los tipos de datos List y Deque (de la librería Collections), para crear colas y pilas.

Donde el tipo de dato Deque resulta tener una implementación más optimizada, que la hace más útil al crear pilas y colas.

Durante las pruebas, las operaciones básicas de append y pop, aunque en ambas no haya mucha diferencia y el coste crece de manera lineal.

Pero en la operacion de popleft, el coste de la lista crece exponencialmente:

Entonces en vez de utilizar el tipo list, deberían mirar un poco mas los de la librería Collection, que son bastante buenos y con mejores opciones.

El código de las pruebas las pueden encontrar en este bloc de notas de collab:

https://drive.google.com/file/d/1b4GOzsJp4HFdKUrDpOzqQ3m94558u90S/view?usp=sharing