¿Cómo puedo aprender a escribir efectivamente código Pythonic?

46

Hacer una búsqueda en Google de "pitón" revela una amplia gama de interpretaciones. La página de wikipedia dice:

Un neologismo común en la comunidad de Python es pitónico, que puede tener una amplia gama de significados relacionados con el estilo del programa. Decir que el código es pitónico es decir que usa bien los modismos de Python, que es natural o muestra fluidez en el lenguaje. Del mismo modo, decir de una interfaz o función de lenguaje que es pitónico es decir que funciona bien con expresiones idiomáticas de Python, que su uso encaja bien con el resto del lenguaje.

También discute el término "no pitónico":

Por el contrario, una marca de código no pitónico es que intenta escribir código C ++ (o Lisp, Perl o Java) en Python, es decir, proporciona una transcripción aproximada en lugar de una traducción idiomática de formas de otro idioma. El concepto de pitonicidad está estrechamente vinculado a la filosofía minimalista de legibilidad de Python y evita el enfoque de "hay más de una forma de hacerlo". El código ilegible o los modismos incomprensibles no son pitónicos.

¿Qué significa el término "pitónico"? ¿Cómo aprendo a aplicarlo efectivamente en la práctica?


fuente
66
Creo que su pregunta puede extenderse a cualquier lenguaje de programación. Siempre hay una forma recomendada de programación que puede ser precisa en un gran número de casos y también para mejorar la revisión, la legibilidad y el mantenimiento. Creo que también desafiar esas recomendaciones puede hacer que un lenguaje evolucione y avance ...
Amine
@Amine tan cierto. En realidad, creo que debería considerarse una wiki comunitaria que consista precisamente en dónde aprender idiomas idiomáticos, para todos los idiomas.
yati sagade
Posiblemente relacionado: programmers.stackexchange.com/questions/47860/…
FrustratedWithFormsDesigner
1
Comentaristas: por favor, dejen de publicar comentarios irrelevantes; han sido eliminados por alguna razón. Si tienes una respuesta, déjala como respuesta. Si desea analizar el tema de esta pregunta, utilice el chat .
1
¡Practicando Python!
Dinámico

Respuestas:

22

He descubierto que la mayoría de la gente tiene sus propias interpretaciones de lo que realmente significa ser "pitón". De Wikipedia:

Un neologismo común en la comunidad de Python es pitónico, que puede tener una amplia gama de significados relacionados con el estilo del programa. Decir que el código es pitónico es decir que usa bien los modismos de Python, que es natural o muestra fluidez en el lenguaje. Del mismo modo, decir de una interfaz o función de lenguaje que es pitónico es decir que funciona bien con expresiones idiomáticas de Python, que su uso encaja bien con el resto del lenguaje.

Por el contrario, una marca de código no pitónico es que intenta escribir código C ++ (o Lisp, Perl o Java) en Python, es decir, proporciona una transcripción aproximada en lugar de una traducción idiomática de formas de otro idioma. El concepto de pitonicidad está estrechamente vinculado a la filosofía minimalista de legibilidad de Python y evita el enfoque de "hay más de una forma de hacerlo". El código ilegible o los modismos incomprensibles no son pitónicos.

He descubierto que la mayoría de las veces, se derivan más ejemplos "pitónicos" de personas que intentan ser inteligentes con las expresiones idiomáticas de Python y (nuevamente, la mayoría de las veces) hacen que su código sea prácticamente ilegible (que no es Pythonic).

Mientras se apegue a los modismos de Python y evite tratar de usar estilos C ++ (u otro lenguaje) en Python, entonces estará siendo Pythonic.

Como señaló WorldEngineer, PEP8 es un buen estándar a seguir (y si usa VIM, hay complementos disponibles para el revestimiento PEP8).


Sin embargo, al final del día, si su solución funciona y no es absolutamente imposible de mantener y lenta, ¿a quién le importa? La mayoría de las veces, su trabajo es realizar una tarea, no escribir el código pitónico más elegante posible.


Otra nota al margen (solo mi opinión, siéntase libre de hacer un voto negativo por eso;)): También he encontrado que la comunidad de Python está llena de un montón de ego (no es que la mayoría de las comunidades no lo sean , es solo un poco más frecuente) en comunidades como C y Python). Entonces, combinar el ego con interpretaciones mal interpretadas de ser "pitónico" tenderá a producir una gran cantidad de negatividad sin fundamento. Toma lo que lees de los demás con un grano de sal. Cumpla con los estándares y la documentación oficiales y estará bien.

Demian Brecht
fuente
2
+1 para una buena respuesta (a excepción de la cita ya que la usé en el OP).
Ugh .. Shoulda volvió a leer el OP antes de publicar la cita: P
Demian Brecht
3
Más bien, existe una alta correlación entre el ego y estar activo en línea, expresando opiniones en cualquier comunidad. Básicamente, no ves tanto a las personas no egoístas porque en primer lugar no escriben tanto.
isarandi
17

Pythonic es codificar idiomáticamente en Python. Significa utilizar estructuras y formatos que funcionen bien para Python desde el punto de vista de la programación, pero también desde el punto de vista de la lectura comunitaria. Es muy parecido a cómo K&R estableció el estándar para el estilo de programación C durante mucho tiempo. Esta guía muestra que debe codificar idiomáticamente en Python. Se hace referencia a PEP 8 en esa guía, por lo que probablemente valga la pena leerlo.

Ingeniero mundial
fuente
1
@MattFenwick ¿No es ese el 90% de lo que se trata la programación? Los buenos programadores pasan mucho tiempo leyendo el código y en qué tiempo queda, escriben mucho código. Cuanto más código Pythonic lea, y cuanto más escriba en Python, más Pythonic será su código. No creo que haya atajos aquí.
Kris Harper
2
Excelente enlace!
Ethan Furman el
13

Escribir código "Pythonic" En mi humilde opinión, solo está haciendo un uso efectivo de las características (V) HLL que proporciona el lenguaje. Como un ejemplo omnipresente,

x, y = 7, 'fuhrer'

Eso es muy pitónico. Recuerdo cuando comencé a aprender C # después de meses de solo Python,

int x, y = 10, z;

de alguna manera me confundió, pero me llevó un minuto volver a mis raíces C / C ++.

Otra forma pitónica es usar lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

en realidad se imprimirá lordenado en orden descendente.

Luego está el "tipeo de patos" muy usado, pero menos entendido: si camina y habla como un pato, lo trata como un pato. Esto está poco relacionado con las interfaces en otros lenguajes OO.

Además, el uso de métodos de programación funcional cuando corresponda, como el uso de map y reduce se considera pitónico.

Vi que se publicaba una respuesta mientras escribía, y contiene un buen enlace. PD: No es que tu conocimiento de Python sea limitado. ¡Puedo apostar a que Python no fue su primer idioma y, por lo tanto, (como la mayoría de nosotros, los pitonistas) tendremos que aprender a ser "idiomáticos" con la serpiente! ¡Salud!

Yati Sagade
fuente
No incluí el enlace porque ya estaba publicado mientras escribía: la respuesta de WorldEngineer :) Solo piense en "explotar" las características del lenguaje para su bien y el de los demás, y obtendrá Pythonic en el camino, y por favor siga ese enlace
yati sagade
44
En realidad, muchos de controversias que map, reduce, lambday tales son idiomática per se. Las comprensiones de listas y la expresión generadora son una alternativa y muchos las prefieren siempre que sea razonablemente posible (en particular, son menos ruidosas cuando se necesita una lambda de todos modos). Ciertamente tienen sus usos, y la programación funcional se muestra en otros idiomas (decorador, por ejemplo).
@delnan estuvo de acuerdo, y aún más cuando se trata de Python 3. La conclusión es que las características funcionales deben usarse exactamente donde sea necesario. Y eso (solo hay una forma obvia de hacerlo) es idiomático :)
yati sagade
Personalmente, nunca he entendido las preferencias de las personas para su primer ejemplo. Esto es mucho más fácil de analizar mentalmente (que es el Zen de Python, el código se lee con más frecuencia de lo que se escribe): ¡ (x, y) = (7, 'fuhrer')pero casi siempre estoy "corregido" que sin parens es la mejor manera de escribirlo!
Izkata
2
Yo diría que su ejemplo de clasificación específico no es pitónico. ¿Por qué reintroducir la reordenación con una lambda si es posible print(sorted(l, reverse=True))? También encontraría su primer ejemplo discutible. Son dos tareas comprimidas en una; está bien, pero no lo llamaría muy pitónico. Los lectores tienen que mirar más de largo lo que hace en comparación con tener dos tareas.
phresnel
7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

El código pitónico es:

  • Legible
  • Simple (lo más simple posible, pero no más simple)
  • Bien pensado
Ethan Furman
fuente
1
+1. El Zen de Python es más importante para escribir código pitónico que seguir una lista de expresiones idiomáticas; este último no cubrirá todas las circunstancias.
Doval
6

Cada vez que he tratado de aprender un nuevo idioma, he descubierto que leer código de personas que conocen el idioma como el dorso de la mano, mirar hacia arriba / preguntar sobre cualquier cosa que parezca extraña, y luego tratar de imitar su estilo es el Lo mejor que puedes hacer. Ejemplos:

En Python, ya que estamos en el tema, encontré los ejemplos de Dive Into Python increíblemente útiles para comenzar. Tienden a enseñar no solo los conceptos básicos de Python, sino también a enfatizar realmente la idiomática Python.

Al aprender D, dado que la documentación no era excelente en ese momento porque el lenguaje era muy avanzado, aprendí al leer el código en la biblioteca estándar, específicamente, algunas de las obras maestras de Andrei Alexandrescu .

Cuando aprendí C ++, heredé una base de código de un buen programador de C ++ y aprendí mucho sobre la programación idiomática de C ++ por su insistencia en pasar contenedores STL por referencia, etc.

En todos los idiomas, encuentro que explorar las preguntas de StackOverflow sobre el idioma y observar lo que la gente suele hacer para lograr cosas básicas ayuda.

dsimcha
fuente
+1 Una vez que conoces los conceptos básicos de un idioma, leer el código te ayudará mucho más que leer libros.
Pace
3

Python no es Java podría darle algunos consejos útiles. No puedo decir más sin saber en qué tipo de problemas te encuentras, pero es un consejo muy concreto para los programadores que vienen de otro idioma (en este caso específicamente Java) sobre cómo hacer Python de manera diferente.

maxpolun
fuente
2

Alguien dijo parafrasear, para aprender qué es Pythonic, simplemente descifrar algo de código. No estoy de acuerdo con eso. Si te gusta escribir código muy denso, eso no lo hace más Pythonic.

Una forma de ayudarlo a definir qué es Pythonic en lo que a usted respecta, pregúntese: "¿Por qué (quiero decir) usaría el lenguaje Python?" ¿Qué te atrae de esto?

Para mí es legibilidad y falta de compilación y código abierto (casi todo). Puedo descargar toneladas de bibliotecas y leer su código fuente con menos estrés por las licencias que muchos otros idiomas.

Para mí, Python es hermosa visualmente. Guido (el creador de Python) también me sigue demostrando, a través de sus respuestas en PEPS y discusiones) que sus elecciones sobre cómo hizo el lenguaje son superiores a mis propias ideas sobre cómo debería haber sido creado.

Para mí, un gran programador es alguien con habilidades de toma de decisiones muy informadas sobre qué camino tomar al codificar. Para mí, Python ayuda a tomar esas decisiones rápidamente.

Al simplificar la sintaxis del código fuente al permitir la escritura de pato en lugar de la conversión de tipo explícito, y la expectativa de que los codificadores que revisan su código "deberían ser codificadores con buen comportamiento" conduce a algo que yo también llamo "Pythonic"

Entonces, hay dos lados de lo que es Pythonic. Uno es sintáctico, el otro es la práctica de. ¿Cómo explicar el lado más profundo de lo que es "Pitónico"?

En Python no es gran cosa hacer esto: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

y la tupla se agregará a la lista sin preocuparse por los tipos de objetos. La parte de Pythonic no es que PUEDES hacer esto, sino que tu código debe ESPERAR esto y solo trabajar / adaptarse.

Cualquier cosa que funcione en el objeto -alista- debe escribirse con la idea de que algún otro codificador podría ingresar y agregar una no cadena a la lista y que la adaptación del código fuente por el nuevo codificador no debería ser difícil de hacer. Ese es el beneficio de ducktype después de todo.

DevPlayer
fuente
-2

Compra un libro recomendado. Léelo Debería proporcionarle una buena base para usar el idioma y un mecanismo que debe cumplir con el estilo de la comunidad

Pablo
fuente