Python es un lenguaje hermoso. 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á codificando un proyecto complicado y se encuentra a sí mismo buscando algo en stackoverflow. ¡Entonces te encuentras con una solución bellamente elegante para tu problema que utiliza una función Python que ni siquiera sabías que existía!
Esa es la forma más divertida de aprender: ¡descubrimiento por exploración y accidente!
Aquí hay 5 de las funciones avanzadas más útiles del lenguaje de programación Python, ¡y lo más importante es cómo usarlas!
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 funcion 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'
¡Ves que fácil fue eso! 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 simplista de usar.
Función Python: (2) Mapas
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]'
¡Mira 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.
Función Python: (3) Filtrado
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 para ver una ilustración:
# 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 filtro () 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.
Función Python: (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 para ver una ilustración impresionante de la magia de Itertools!
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])
Función Python: (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 range()función Python 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 xrange()función Python 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 xrangefunció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 range función.
Esto se debe a que los generadores xrangegenerarán los valores de la lista cada vez que acceda a ellos, mientras que rangees 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))
Lectura recomendada
¿Quieres aprender más sobre la codificación en Python? Sguie leyendo nuestro los blog de nuestro sitio!.