Una función python es fácil de usar y poderosamente expresiva. Pero, ¿ estás usando todo lo que tiene para ofrecer?
Las características avanzadas de cualquier lenguaje de programación generalmente se descubren a través de una amplia experiencia.
Estás codificando un proyecto complicado y se encuentras a tí mismo buscando algo en stackoverflow. ¡Entonces te encuentras con una solución elegante para tu problema, que utiliza una función Python que ni siquiera sabías que existía!
Bueno, aquí hay 5 de las funciones avanzadas muy útiles del lenguaje de programación Python:
Función Python
1- Funciones Lambda
Una función Lambda es una función pequeña y anónima, anónima en el sentido de que en realidad no tiene un nombre.
Una función Python se define típicamente usando el estilo de def a_function_name()
, pero con las funciones lambda no le damos un nombre. Hacemos esto porque el propósito de una función lambda es realizar algún tipo de expresión u operación simple sin la necesidad de definir completamente una función.
Una función lambda puede tomar cualquier número de argumentos, pero siempre debe tener una sola expresión:
x = lambda a, b : a * b print(x(5, 6)) # prints '30'
x = lambda a : a*3 + 3 print(x(3)) # prints '12'
En este caso realizamos un poco de matemática básica sin la necesidad de definir una función completa. Esta es una de las muchas características de Python, que lo convierte en un lenguaje de programación limpio y simple de usar.
2- Map()
Map()
es una función Python incorporada que se utiliza para aplicar una función a una secuencia de elementos como una lista o un diccionario.
Es una forma muy limpia y, lo que es más importante, legible para realizar dicha operación:
def square_it_func(a): return a * a x = map(square_it_func, [1, 4, 7]) print(x) # prints '[1, 16, 49]'
def multiplier_func(a, b): return a * b x = map(multiplier_func, [1, 4, 7], [2, 5, 8]) print(x) # prints '[2, 20, 56]'
Viendo el ejemplo de arriba, podemos aplicar nuestra función python a una sola lista o listas múltiples. A primera vista, puedes usar un mapa con cualquier función de python que puedas imaginar, siempre que sea compatible con los elementos de secuencia en los que estás operando.
3- Filter()
La función python incorporada de Filtro es bastante similar a la función Mapa , ya que aplica una función a una secuencia (lista, tupla, diccionario). La diferencia clave es que filter() solo devolverá los elementos que la función aplicada devolvió como Verdadero .
Vea el siguiente ejemplo:
# Our numbers numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] # Function that filters out all numbers which are odd def filter_odd_numbers(num): if num % 2 == 0: return True else: return False filtered_numbers = filter(filter_odd_numbers, numbers) print(filtered_numbers) # filtered_numbers = [2, 4, 6, 8, 10, 12, 14]
No solo evaluamos Verdadero o Falso para cada elemento de la lista, la función de filter() también se aseguró de devolver solo los elementos que coincidían como Verdadero. Muy conveniente para manejar dos pasos para verificar una expresión y construir una lista de retorno.
4- Itertools
El módulo Ithtools de Python es una colección de herramientas para el manejo de iteradores. Un iterador es un tipo de datos que se puede usar en un bucle for que incluye listas, tuplas y diccionarios.
El uso de las funciones en el módulo Itertools le permitirá realizar muchas operaciones de iterador que normalmente requerirían funciones multilínea y una comprensión de lista complicada.
Echa un vistazo a los ejemplos a continuación:
from itertools import * # Easy joining of two lists into a list of tuples for i in izip([1, 2, 3], ['a', 'b', 'c']): print i # ('a', 1) # ('b', 2) # ('c', 3) # The count() function returns an interator that produces consecutive integers, forever. This one is great for adding indices # next to your list elements for readability and convenience for i in izip(count(1), ['Bob', 'Emily', 'Joe']): print i # (1, 'Bob') # (2, 'Emily') # (3, 'Joe') # The dropwhile() function returns an iterator that returns all the elements of the input which come after a certain condition # becomes false for the first time. def check_for_drop(x): print 'Checking: ', x return (x > 5) for i in dropwhile(should_drop, [2, 4, 6, 8, 10, 12]): print 'Result: ', i # Checking: 2 # Checking: 4 # Result: 6 # Result: 8 # Result: 10 # Result: 12 # The groupby() function is great for retrieving bunches of iterator elements which are the same or have similar properties a = sorted([1, 2, 1, 3, 2, 1, 2, 3, 4, 5]) for key, value in groupby(a): print(key, value), end=' ') # (1, [1, 1, 1]) # (2, [2, 2, 2]) # (3, [3, 3]) # (4, [4]) # (5, [5])
5- Generadores
Las funciones del generador le permiten declarar una función python que se comporta como un iterador, es decir, se puede usar en un bucle for. Esto simplifica enormemente su código y es mucho más eficiente en memoria que un simple bucle for.
Considere un ejemplo en el que deseamos sumar todos los números del 1 al 1000. La primera parte del código a continuación ilustra cómo lo haría usando un bucle for.
Ahora, todo está bien y elegante si la lista es pequeña, digamos una longitud de 1000. El problema surge cuando se quiere hacer esto con una lista enorme , digamos 1 billón de números flotantes.
Con un bucle for, esa enorme lista de masticación de memoria se crea en la memoria, ¡ no todos tienen memoria RAM ilimitada para almacenar tal cosa!. La función Pythonrange()
hace lo mismo, construye la lista en la memoria
La sección (2) del código ilustra la suma de la lista de números utilizando un generador de Python. Un generador creará elementos y los almacenará en la memoria solo cuando los necesite, es decir, uno a la vez.
Eso significa que, si tiene que crear 1 billón de números de punto flotante, ¡solo los almacenará en la memoria uno a la vez!.
La función Python xrange()
usa generadores para construir listas.
Moraleja de la historia: si tiene un gran rango para el que le gustaría generar una lista, use un generador o la xrange
función.
Esto es especialmente cierto si tiene un sistema realmente sensible a la memoria, como la computación móvil o avanzada.
Dicho esto, si desea recorrer la lista varias veces y es lo suficientemente pequeño para caber en la memoria, será mejor usarlo para los bucles y la función range
.
Esto se debe a que los generadores xrange
generarán los valores de la lista cada vez que acceda a ellos, mientras que range
es una lista estática y los enteros ya existen en la memoria para un acceso rápido.
# (1) Using a for loop numbers = list() for i in range(1000): numbers.append(i+1) total = sum(numbers)
# (2) Using a generator def generate_numbers(n): num = 0 while num < n: yield num num += 1 total = sum(generate_numbers(1000))
# (3) range() vs xrange() total = sum(range(1000 + 1)) total = sum(xrange(1000 + 1))