Entonces, de acuerdo con el Zen de Python ... Explícito es mejor que implícito ... Escaso es mejor que denso ... La legibilidad cuenta ... pero, de nuevo, Flat es mejor que anidado ... entonces, ¿cuál es pythonic ?

val = "which is pythonic?"
print("".join(reversed(val)))

O

print(val[::-1])

Solo soy un programador de Java que está aprendiendo Python, así que me parece interesante este pythonic , ya que no existe un análogo en el mundo de Java AFAIK.

14
non sequitor 8 nov. 2009 a las 07:42

4 respuestas

La mejor respuesta

Mi esposa Anna ha apodado a x[::-1] "la sonrisa marciana". En general, me inclino ante ella (y su larga experiencia en formación, etc., y estudios en psicología humana, etc.) cuando se trata de juzgar lo que es fácil y natural para la mayoría. gente, y ella absolutamente ama la carita marcial. "Simplemente camine hacia atrás", ¡cuánto más directo y de alta abstracción que la especificación detallada de "inviértalo y luego únase a él"!

Además, python -mtimeit a menudo es un buen juez de lo que es Pythonic: los mejores Pythonistas, a lo largo de los años, han tendido a optimizar lo que necesitan y usan con mayor frecuencia, por lo que una diferencia de rendimiento muy sustancial le dice qué "va con el grano "del lenguaje y sus mejores practicantes. Y según ese puntaje, el smiley marciano supera las especificaciones detalladas sin lugar a dudas ...:

$ python -mtimeit '"".join(reversed("hello there!"))'
100000 loops, best of 3: 4.06 usec per loop
$ python -mtimeit '"hello there!"[::-1]'
1000000 loops, best of 3: 0.392 usec per loop

¡Las diferencias de rendimiento de orden de magnitud simplemente no dejan mucho margen para la duda! -)

45
Alex Martelli 8 nov. 2009 a las 04:59

Primero, si eres un principiante, no te preocupes por qué es más pitónico o no. Esto huele a guerras de idiomas, y eventualmente encontrarás tu propia opinión de todos modos. Solo usa la forma en que crees que es más legible / más simple para ti y creo que encontrarás la luz.

Dicho esto, estoy de acuerdo con la excelente respuesta de Alex (ya que él siempre tiene la razón) y agregaría un comentario adicional sobre por qué debería preferir el segundo método: el primero solo funcionará correctamente si val es una cadena.

0
J S 8 nov. 2009 a las 05:08

Con una cadena, como usted tiene, iría con la primera opción, ya que deja en claro que el resultado que desea es una cadena. Para una lista u otro iterable / slicable, iría con el segundo.

Un beneficio adicional de la primera forma es que funcionará si val no es realmente una cadena, sino algunos otros caracteres iterables (por ejemplo, un generador de algún tipo). En algunos casos, esto hace una gran diferencia.

0
Daniel Pryden 8 nov. 2009 a las 04:51

El segundo (en mi opinión) es más pitónico, ya que es más simple, más corto y más claro.

Para obtener más información sobre qué es Pythonic , recomendaría The Zen de Python:

Hermoso es mejor que feo.
      Explícito es mejor que implícito.
      Simple es mejor que complejo.
      Complejo es mejor que complicado.
      Plano es mejor que anidado.
      Escaso es mejor que denso.
      La legibilidad cuenta.
      Los casos especiales no son lo suficientemente especiales como para romper las reglas.
      Aunque la practicidad supera la pureza.
      Los errores nunca deben pasar en silencio.
      A menos que sea silenciado explícitamente.
      Ante la ambigüedad, rechaza la tentación de adivinar.
      Debe haber una, y preferiblemente solo una, forma obvia de  hazlo.
      Aunque esa manera puede no ser obvia al principio a menos que seas holandés.
      Ahora es mejor que nunca.
      Aunque nunca es mejor que ahora ahora.
      Si la implementación es difícil de explicar, es una mala idea.
      Si la implementación es fácil de explicar, puede ser una buena idea.
      Los espacios de nombres son una gran idea, ¡hagamos más de eso!

En mi opinión, su segundo ejemplo satisface estos principios:

Hermoso es mejor que feo.
Simple es mejor que complejo.
Escaso es mejor que denso.
La legibilidad cuenta.

4
Andrew Hare 8 nov. 2009 a las 04:44