5 características de Python que no conocía, pero en vano

Python, sin duda, puede llamarse un lenguaje que ha experimentado un crecimiento significativo en la última década, un lenguaje que ha demostrado ser poderoso. He creado muchas aplicaciones de Python, desde mapas interactivos hasta blockchains . Python tiene muchas características. Es muy difícil para los principiantes comprender todo esto de una vez.



Incluso si eres un programador que está cambiando a Python desde otro lenguaje como C, o si eres un científico que solía trabajar en MATLAB, la programación de Python usando abstracciones de alto nivel es definitivamente una experiencia muy especial. Quiero hablar sobre cinco características muy importantes, en mi opinión, de Python que, desafortunadamente, no conocía antes.

1. Inclusión de listas: escribir un código compacto


Muchos llamarían mecanismos de Python como lambda , map y filter los secretos que todo programador novato debería aprender. Y aunque estoy seguro de que vale la pena saber todo esto, en la mayoría de las situaciones en las que se pueden aplicar estas herramientas, he encontrado una flexibilidad insuficiente de estas herramientas. Como resultado, están lejos de ser tan útiles como parecen.

Lambda es un método para crear funciones pequeñas de una sola línea para un solo uso. Si se llama a una función muchas veces, degrada el rendimiento. Pero al mismo tiempo, la función de map aplica la función a todos los elementos de la lista, y el filter selecciona de un determinado conjunto de elementos un subconjunto correspondiente a la condición especificada por el usuario.

 add_func = lambda z: z ** 2 is_odd = lambda z: z%2 == 1 multiply = lambda x,y: x*y aList = list(range(10)) print(aList) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

La comprensión de listas es un diseño compacto y conveniente que se utiliza para crear listas a partir de otras listas utilizando expresiones y condiciones flexibles. Esta construcción se describe utilizando corchetes. Incluyen expresiones o funciones que se aplican a cada elemento de la lista solo si ese elemento cumple una determinada condición. La inclusión de listas puede ser una estructura de varios niveles que contiene bloques anidados. Esto le permite procesar listas anidadas, lo que brinda mucha más flexibilidad que usar el map y el filter .

Aquí está la sintaxis para la inclusión de la lista:

 [ expression(x) for x in aList if optional_condition(x) ] 

Aquí hay un ejemplo:

 print(list(map(add_func, aList))) print([x ** 2 for x in aList]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(list(filter(is_odd, aList))) print([x for x in aList if x%2 == 1]) # [1, 3, 5, 7, 9] # [1, 3, 5, 7, 9] 

2. Trabajar con listas - listas circulares


Python le permite usar índices negativos al trabajar con listas. La siguiente comparación es verdadera:

 aList[-1] == aList[len(aList)-1] 

Esto hace posible, por ejemplo, obtener el segundo elemento del final de la lista utilizando la aList[-2] . Otros diseños similares son posibles.

Además, puede obtener una porción de la lista:

 aList[start:end:step] 

Aquí, el elemento inicial de la lista se incluye en el segmento resultante, y el elemento final no se incluye en él. Supongamos que la lista se ve así:

 aList = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

El aList[2:5] se verá como [2, 3, 4] . Además, puede "voltear" la lista utilizando el aList[::-1] . En nuestro caso, esto dará [9, 8, 7, 6, 5, 4, 3, 2, 1] . Esta solución para la tarea de "voltear" de la lista me parece muy visual y exitosa.

También puede desempaquetar la lista colocando los valores almacenados en ella en variables separadas. O - "descomponiendo" sus valores en variables separadas y listas nuevas usando un asterisco:

 a, b, c, d = aList[0:4] print(f'a = {a}, b = {b}, c = {c}, d = {d}') # a = 0, b = 1, c = 2, d = 3 a, *b, c, d = aList print(f'a = {a}, b = {b}, c = {c}, d = {d}') # a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9 

3. zip y funciones de enumeración: crear potentes bucles


La función zip crea un iterador que combina los elementos de varias listas. Esto permite el rastreo paralelo de listas for bucles for y la clasificación paralela. Puede devolver los elementos combinados a su estado normal utilizando el operador * .

Aquí hay un ejemplo de cómo trabajar con la función zip :

 numList = [0, 1, 2] engList = ['zero', 'one', 'two'] espList = ['cero', 'uno', 'dos'] print(list(zip(numList, engList, espList))) # [(0, 'zero', 'cero'), (1, 'one', 'uno'), (2, 'two', 'dos')] for num, eng, esp in zip(numList, engList, espList):    print(f'{num} is {eng} in English and {esp} in Spanish.') # 0 is zero in English and cero in Spanish. # 1 is one in English and uno in Spanish. # 2 is two in English and dos in Spanish. 

Pero aquí se explica cómo devolver las listas a su estado normal:

 Eng = list(zip(engList, espList, numList)) Eng.sort() #   engList a, b, c = zip(*Eng) print(a) print(b) print(c) # ('one', 'two', 'zero') # ('uno', 'dos', 'cero') # (1, 2, 0) 

La función de enumerate , a primera vista, puede parecer muy complicada, pero si la maneja, resulta que puede ser útil en muchos casos. Este es un contador automático que a menudo se usa for bucles. Además, en tales ciclos no es necesario crear e incrementar una variable de contador usando construcciones como counter = 0 y counter += 1 .

Las funciones zip y enumerate son dos de las herramientas más poderosas utilizadas en la construcción for bucles:

 upperCase = ['A', 'B', 'C', 'D', 'E', 'F'] lowerCase = ['a', 'b', 'c', 'd', 'e', 'f'] for i, (upper, lower) in enumerate(zip(upperCase, lowerCase), 1):    print(f'{i}: {upper} and {lower}.') # 1: A and a. # 2: B and b. # 3: C and c. # 4: D and d. # 5: E and e. # 6: F and f. 

4. Generadores: uso eficiente de la memoria


Los generadores se utilizan en los casos en que es necesario realizar ciertos cálculos que conducen a la aparición de un gran conjunto de resultados, pero al mismo tiempo es necesario evitar la asignación simultánea de memoria para almacenar todos esos resultados. En otras palabras, los generadores dan ciertos valores, como dicen, "sobre la marcha". Sin embargo, no almacenan en la memoria los valores encontrados previamente por ellos. Como resultado, la memoria se usa con moderación.

Los generadores se usan a menudo para leer archivos grandes o para crear secuencias infinitas usando la palabra clave de yield . A menudo me parece apropiado usarlos en mis proyectos de investigación.

 def gen(n):  #     ,   >= n    while True:        yield n        n += 1       G = gen(3)   #   3 print(next(G)) # 3 print(next(G)) # 4 print(next(G)) # 5 print(next(G)) # 6 

5. Entorno virtual - aislamiento de código


Si pudieras elegir solo una idea de este artículo que puedas recordar, entonces te aconsejaría sobre la que hablaremos en esta sección. Estamos hablando de entornos virtuales (entorno virtual).

Las aplicaciones de Python a menudo usan muchos paquetes diferentes. Fueron creados por diferentes desarrolladores, difieren en complejos conjuntos de dependencias. En una aplicación determinada, se puede usar una versión específica de una biblioteca determinada. Sin embargo, otra versión para dicha aplicación no funcionará. Pero, ¿qué pasa si varias aplicaciones usan diferentes versiones de la misma biblioteca? Esta es una pregunta difícil que nos lleva a la idea de que no existe un entorno universal, cuyos paquetes instalados son adecuados para absolutamente todas las aplicaciones. La respuesta a esta pregunta se puede llamar el uso de entornos virtuales.

Para crear entornos virtuales aislados entre sí, puede hacer esto:

 conda create -n venv pip python=3.7 #   python source activate venv ... source deactivate 

Resumen


En este artículo, hemos cubierto 5 funciones útiles de Python. Es decir, se trataba de inclusiones de listas, listas cíclicas, funciones zip y enumerate , generadores y entornos virtuales. Esperamos que estas características sean útiles.

Estimados lectores! Si pudieras decirle a un programador novato solo una característica de Python, ¿qué elegirías?

Source: https://habr.com/ru/post/482458/


All Articles