Desarrollador Java que aprende Python: ¿qué conceptos necesito para entender?

38

Antecedentes: revisé algunos tutoriales y escribí algunos proyectos pequeños. Todo va lo suficientemente bien con Google y StackOverflow .

Varias veces en los últimos días me he preguntado "¿qué me estoy perdiendo?" - Siento que todavía estoy pensando en Java mientras escribo en Python.

Esta pregunta en StackOverflow está llena de consejos sobre qué recursos leer para aprender Python, pero todavía siento que soy un desarrollador de Java con un diccionario (sin juego de palabras) para traducir a Python.

Lo que realmente quiero hacer es refactorizar mi cabeza para poder escribir Pythonic Python en lugar de Java disfrazado de Python, sin perder mis habilidades en Java tampoco.

Entonces, el quid de mi pregunta es: ¿qué conceptos realmente necesita un desarrollador de Java para aprender a pensar Pythonic? Esto incluye todo lo que necesita ser desaprendido.

Nota: Estoy preguntando sobre conceptos de lenguaje, no sobre sintaxis de lenguaje.

LRE
fuente
9
Deja de lado la idea de que se supone que la programación es difícil.
Trabajo

Respuestas:

40

Algunos puntos además de lo que ya se dijo:

  • Python es dinámico. La creación de una clase es una declaración ejecutable , como lo es la importación de un módulo; Se puede hacer condicional. Una clase puede ser alterada después de la creación; Esto permite una fácil metaprogramación y AOP.

  • No hay interfaces reglas de escritura de pato. Si los necesita desesperadamente, hay 'clases base abstractas (ABC)', pero generalmente no se pierden las interfaces, ya que de todos modos no hay verificación de tipo estático.

  • Aunque todo es un objeto, las funciones vienen antes que los objetos. Tener solo funciones (y sin clases) en un módulo está perfectamente bien.

  • Todo es una entidad de primera clase. Pasar funciones como parámetros, devolverlas y asignarlas a variables es la norma. Lo mismo para las clases. Los métodos son solo funciones; puede manejar un método de instancia como si fuera una función regular, pasarlo, etc.

  • Use dictados, conjuntos, listas y tuplas incorporados. Las listas y los dictados son mutables, las tuplas no. Todos ellos son muy eficientes y sintácticamente sucintos. Acostúmbrate a devolver varios valores de una función usando una tupla (ni siquiera necesitas paréntesis). Acostúmbrese a reemplazar jerarquías complejas de objetos muy simples con artilugios hechos de listas simples, tuplas y dictos ('tablas hash'), simplifica la vida.

  • Python tiene bastante soporte de FP; aprender listas de comprensión y luego iteradores y generadores. Estos ayudan mucho.

  • Cualquier operador puede sobrecargarse definiendo los métodos adecuados, por lo que la suma o la comparación pueden devolver lo que desee. Recuerda esto trabajando con cosas como SQLAlchemy.

  • No hay nulo, solo Ninguno, un objeto de pleno derecho. Puede imprimir Ninguno bien, etc. Pasar Ninguno donde se espera otra instancia generalmente da como resultado un AttributeError, no un NPE, a veces más abajo en la tubería de ejecución.

  • Debido a la naturaleza completamente dinámica de Python, casi no tiene controles estáticos . Puede hacer referencia a un nombre que nunca existe en su programa (por ejemplo, un error tipográfico), o que solo se define en una ruta de ejecución particular, y nada lo recordará hasta que la ejecución realmente llegue a esta referencia y se genere un NameError. Tenga cuidado con el alcance de sus variables y escriba más pruebas unitarias.

  • Debido a la naturaleza completamente dinámica de Python, los objetos son casi siempre maleables. Por lo general, puede agregar campos y métodos incluso a una instancia y, por lo tanto, eliminar o sobrescribir inadvertidamente su estado o conjunto de métodos. Tenga cuidado al asignar atributos. Esto también permite posibilidades interesantes :)

  • No hay constantes simbólicas , solo variables. Compruebe que no sobrescribe accidentalmente una 'constante'. Si desea estar seguro de que no puede sobrescribir una constante, use una función o una propiedad (que es una función disfrazada).

  • Los hilos de Python son buenos para el procesamiento vinculado a E / S, pero no para la CPU. No intente acelerar una tarea computacional ejecutándola en hilos paralelos.

9000
fuente
+1 muy buenos puntos. Nitpicking: Nonegeneralmente causa AttributeError(pero no importa, generalmente no lo necesita de todos modos) y puede (y en algunos casos debería) escribir objetos inmutables (por ejemplo, a través de namedtuple).
@danlan: gracias, he corregido el texto :) Sí, puedes crear objetos inmutables. Pero los objetos que generalmente crea al crear una clase regular y luego sus instancias son muy mutables, a menos que tome una serie de medidas especiales. El hecho de que la asignación a un atributo de instancia indefinido generalmente lo defina silenciosamente en lugar de causar un error puede ser una sorpresa para un programador de Java.
9000
1
Python (y otros lenguajes FP) reemplaza la construcción de código más detallado de bloques de construcción más simples con la construcción de código compacto en bloques de construcción más complejos. Piense en los procesadores RISC vs CISC.
Paul
1
Agregaría conjuntos a las estructuras de datos.
sakisk
2
Hace poco más de 3 años que hice esta pregunta. Tengo que decir que este consejo se ha mantenido muy bien.
LRE
14

Lea este artículo: Python no es Java . (Además, vale la pena leer la mayoría de los otros artículos de la barra lateral, aunque no están relacionados con Java). El artículo ofrece algunos buenos consejos sobre cómo los programadores de Java pueden usar Python de manera involuntaria (y cómo no hacerlo).

Cíclope
fuente
66
"XML no es la respuesta". - eso va mucho más allá de Java v Python ;-)
LRE
3

Me mudé de Java a Python y una de las cosas más útiles que encontré fue poder probar el código desde el intérprete de línea de comandos. Escriba python en la línea de comando y ejecute su código desde allí hasta que lo haga bien.

Los marcos también estaban un poco menos definidos en Python. Hay 10s de marcos web solo para principiantes. Django reemplaza más o menos Spring y SQL Alchemy para Hibernate.

Bassdread
fuente
2

Una cosa importante sería entender la escritura dinámica; otro es que los objetos son mutables y públicos. Menos importante, al menos inicialmente, es el enlace de nombres frente a las variables.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Aquí, myjobtitle y el valor de job.title apuntan al mismo objeto. Al atributo de clase job.startDate se le ha asignado primero una cadena, luego a un objeto de tiempo. Y a pesar de todo, la instancia de trabajo e incluso la clase en sí misma podrían cambiarse dinámicamente.

Arcege
fuente
1

También es posible que desee echar un vistazo a Jython . Es posible que solo sea compatible con Python 2.5, pero consideramos que es realmente poderoso poder realizar un prototipo rápido con Python y luego reescribirlo en Java más adelante si es necesario.

Según mi respuesta a ¿Qué debo pensar al cambiar de Python a Java? ¡ya que esa pregunta ahora se ha cerrado como un duplicado de esta!

Mark Booth
fuente