¿Qué es la derivación del generador en Python?
Python tiene una sintaxis compacta para crear listas mediante bucles y condicionales. Esta sintaxis se llama composición de lista:
mi_lista =[f(x)para x en secuencia si cond(x)]
De manera similar, podemos crearla a través de la composición del diccionario, creando un conjunto a través de la composición del conjunto:
my_dict = { k (x): v (x) para x en secuencia if cond (x)}
my_set = { f (x) para x en secuencia if cond(x)}
(Esta sintaxis admite operaciones más complejas, pero esto es solo un ejemplo).
Finalmente, puedes crear un generador usando una sintaxis similar:
my_generator = (f(x)for x in secuencia if cond(x))
Sin embargo, esto no se llama derivación generadora, sino expresión generadora. ¿Por qué no llamarlo lo primero? Si las tres primeras sintaxis se denominan "derivadas", ¿por qué no llamarlas generadoras?
Al final de People's Education Edition 289-Generator Expression se incluye una nota detallada que establece que Raymond Hettinger propuso por primera vez el uso del término "síntesis de generador" y más tarde Peter Norvig propuso "visualización acumulativa". y más tarde Tim Peters recomendó "expresiones generadoras".
Sustantivo. Pero no tiene tal cambio de sustantivo.
EarlGrey: ¡Todas estas personas mencionadas anteriormente son excelentes personas! Específicamente, puedes buscarlo en Google.
Entonces hice esta pregunta en Twitter:
Python tiene un problema que no entiendo: ¿por qué se llaman "expresiones generadoras" en lugar de "generadores "derivados"?
La respuesta de Guido señaló la razón central:
La derivación originalmente pertenecía al concepto de "visualización literal". La expresión del generador no es una visualización.
Matt Bohm descubrió más tarde un correo electrónico de Tim Peters proponiendo el término "emoticón dinamo", que reveló algunos detalles:
Después de leer el correo electrónico, tengo una comprensión más profunda de este tema. En primer lugar, ¿por qué utilizar la palabra "deducción"? Tim señaló en el correo electrónico que el término proviene del axioma de complejidad en la teoría de conjuntos, que se refiere a aplicar un predicado a los elementos de otro conjunto.
) y formar una nueva colección. Esto es muy similar a aplicar una condición a elementos de otra secuencia para generar una lista.
EarlGrey: He visto muchas traducciones de "análisis" antes. Después de ver esto, creo que "deducción" es un término más preciso.
Como señaló Guido, los diseñadores de Python se centran más en la visualización que en los condicionales. La palabra "mostrar" aquí significa que la sintaxis del código se parece a la estructura de datos que creará. La visualización de lista (derivada de lista) parece una lista. Lo mismo ocurre con las colecciones y las visualizaciones de diccionarios. Pero como no existe una sintaxis literal del generador, no se muestra ningún generador para comparar, por lo que no se muestra ningún generador.
En los correos electrónicos que diseñaron la función, "derivar" alguna vez fue sinónimo de "mostrar". Como el generador no lo expone, no es posible ninguna derivación.
Sin embargo, "Times" también afirmó en un correo electrónico que la magia del proceso de derivación reside en las condiciones. El núcleo de los axiomas deductivos es el predicado. Quizás porque los condicionales en la derivación de Python son opcionales, el enfoque se ha desplazado a la visualización.
Pero creo que deberíamos llamarlo "derivación del generador". Al describir esta sintaxis, no utilizamos la palabra "mostrar". No hay razón para asociar "deducción" con "exhibición" y gramática literal.
Las listas por comprensión, las de diccionario, las de conjuntos y las expresiones generadoras tienen muchas similitudes entre ellas. Si las similitudes entre los cuatro se resumen como "derivación", los conceptos relacionados se simplificarán enormemente. Las similitudes entre ellos superan con creces las diferencias. Te sugiero que uses el mismo concepto para las cuatro expresiones.