1. Introducción
Las comprensiones (también conocidas como analíticas) son una característica única de Python. Una deducción es una estructura que puede construir una nueva secuencia de datos a partir de una secuencia de datos . Hay tres tipos de derivaciones, ambas compatibles con Python 2 y 3:
- Comprensión de listas
- Dict comprensión
- Establecer comprensión
La introducción oficial a la deducción es:
La comprensión consta de una sola expresión seguida de al menos una cláusula for y cero o más cláusulas for o if . En este caso, los elementos del nuevo contenedor son aquellos que se producirían considerando cada una de las cláusulas for o if como un bloque, anidando de izquierda a derecha y evaluando la expresión para producir un elemento cada vez que se alcance el bloque más interno.
La comprensión se compone de una sola expresión, la expresión va acompañada de 0 o más cláusulas for / if, pero hay al menos una cláusula for. En este caso, los elementos del nuevo contenedor se generan así: trate cada cláusula en la cláusula for o if como un bloque, anide de izquierda a derecha y calcule la expresión para llegar a lo más interno cada vez que se genere un elemento. cuando la capa del bloque.
En segundo lugar, la gramática específica
Comprensión de listas []
- Genere una lista en el intervalo [0,30).
>>> multiples = [i for i in range(30)]
>>> print(multiples)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
>>>
- Genere una lista divisible por 3 en el intervalo [0,30).
>>> multiples = [i for i in range(30) if i % 3 == 0]
>>> multiples
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
Comprensión del diccionario {}
Utilice la comprensión del diccionario para excluir los elementos del diccionario con la clave "1"
def Dict_comprehension_Test():
src_dict = {
"1": 'first',
"2": 'second',
"3": 'third'
}
exclude1_dict = {key:value for key, value in src_dict.items() if key != "1"}
print(src_dict)
print(exclude1_dict)
Resultado de salida:
{'1': 'first', '2': 'second', '3': 'third'}
{'2': 'second', '3': 'third'}
Establecer comprensión {}
def Set_comprehension_Test():
list_src = [1,1,2]
set_seq={i**2 for i in list_src}
print(set_seq)
print(type(set_seq))
Resultado de salida:
{1, 4}
<class 'set'>
La diferencia con el primero:
- A diferencia de la comprensión de listas, la comprensión de conjuntos utiliza el símbolo {} (llaves) ;
- A diferencia de las comprensiones de diccionario, las comprensiones de conjuntos no tienen pares clave-valor ;
Expresión generadora
La misma sintaxis, usando () --- paréntesis producirá un generador .
>>> lista=[1,2,3,4,5,6]
>>> test_gen=(i for i in lista if i !=3 )
>>> print(test_gen)
<generator object <genexpr> at 0x028C6E70>
>>> next(test_gen)
1
>>> next(test_gen)
2
>>> test_gen.__next__()
4
>>>
Ventajas de utilizar comprensiones / generadores
- Simplifique la escritura de código;
- Mejorar la eficiencia operativa
Por ejemplo, encuentre la suma de los cuadrados de todos los números naturales en el rango (0, 10).
- Posibles formas de utilizar expresiones generativas:
>>> sum_a = sum(x*x for x in range(0,10))
>>> sum_a
285
- Una forma posible de escribir sin generar una fórmula es:
def sum_power_ten():
src = range(0, 10)
sum = 0
for i in src:
sum += (i*i)
print(sum)
Comparado:
El código que no usa la fórmula generativa usa la variable temporal src para almacenar el rango y luego usa el bucle for para atravesar el rango de rango El código es mucho más complicado que la fórmula generativa.