Preguntas sobre "Python no es Java" [cerrado]

Soy un programador novato con experiencia básica en Java y actualmente estoy aprendiendo Python. Me encontré con esta publicación de blog en otro hilo de preguntas:

http://dirtsimple.org/2004/12/python-is-not-java.html

y tengo un par de preguntas sobre el tema publicado:


1) "Ah, y todas esas cadenas de atributos Foo.Bar.Baz no vienen gratis, ..., así que cada punto cuenta".

¿La solución a este problema en particular es importar el módulo y su método de antemano? Tal como:

       from Foo.Bar import Baz
       ...
       #now Baz() can be called directly without using Foo.Bar.Baz() everytime

2) ¿Tiene una declaración de cambio? La traducción de Python es una tabla hash, no un montón de declaraciones if-then.

Hay varias respuestas relacionadas con respecto a este tema, pero también plantean un par de preguntas:

  1. El uso de if-else es más limpio, pero no tiene la ventaja del tiempo constante O (1) en la instrucción switch.
  2. Uso de hash para tiempo constante O (1)
  3. Uso de la función lambda en hash para comparación (no recomendado)
    • ¿Por qué no se recomienda? ¿Es porque la función lambda elimina el factor constante de hash?
  4. Uso del módulo bisect
    • ¿Este método retiene el tiempo constante O (1) o es simplemente otro tipo de función lambda?
    • Entonces, ¿qué método en Python, que es igual a la declaración de cambio, con tiempo constante O (1), mientras que al mismo tiempo permite la declaración de comparación?

3) Los getters y setters son malvados. Malvado, malvado ... no escribas getters y setters ... Para esto es la 'propiedad' incorporada ... En Python, esto (getter y setter) es una tontería, porque puedes comenzar con una atribuir y cambiar de opinión en cualquier momento, sin afectar a ningún cliente de la clase.

Realmente no entiendo bien esta parte.

Además, parece que en Python se puede acceder fácilmente a métodos o variables públicos y privados, en contraste con C ++ y Java. ¿Hay alguna razón de diseño para este comportamiento?


Finalmente, ¿hay alguna buena lectura adicional recomendada sobre Python en comparación con cualquier otro lenguaje de programación?

preguntado el 16 de mayo de 11 a las 17:05

Si tiene varias preguntas, divídalas en varias. -

Sí, divida su pregunta en varias preguntas más específicas. -

No intente aprender ningún lenguaje de programación aprovechando el conocimiento de otro lenguaje de programación. Los lenguajes de programación (con algunas excepciones) son más diferentes que similares. Es mucho más fácil para tu cerebro comenzar "desde cero" cuando aprendes un nuevo idioma. Intente evitar comparar sintaxis o semántica entre idiomas. -

3 Respuestas

  1. Rara vez importa. Si lo hace, sería mejor escribir C (o dejar que Cython lo haga por usted, con anotaciones de tipo estático para que realmente cuente), usando PyPy (su JIT puede eliminar por completo tales búsquedas y muchas más cosas, incluso asignaciones de memoria). , en ciertos bucles), etc.
  2. "lambda" está en una categoría diferente a "cadena if-elif" o "bisect". ¿A qué técnica te refieres específicamente? A muchos no les gusta lambda ya que lo consideran relativamente detallado o ilegible (al menos algunos de sus usos pueden volverse así de rápido). bisect solo mantiene una lista ordenada, por lo que la mejor búsqueda que obtiene es la búsqueda binaria O (log N). ¿Quieres una declaración de cambio? Usa dictados. Comparaciones (aparte de ==, por supuesto) están fuera del alcance de switch y la mayoría de las cosas comúnmente se comparan con ellos y hacen una búsqueda O (1) imposible de todos modos.
  3. ¿Qué pasa con lo que no es comprensible? Cuando escribe Python, no escribe métodos getter o setter. Usas atributos normales. Si luego ve que necesita más lógica sobre el acceso / modificación de atributos, lo convierte en una propiedad y todo el código que lo usa puede ejecutarse sin cambios.
  4. En cuanto a la ausencia de privacidad real, esto se ha preguntado y respondido muchas veces, la respuesta corta es que "todos somos adultos aquí", es decir, se confía en que los programadores no jueguen con cosas privadas a menos que tengan una muy buena razón. Otra razón más débil es que esto es difícil de implementar en un lenguaje dinámico, al menos con el modelo de objetos actual (donde los métodos son solo funciones normales, por ejemplo).

contestado el 16 de mayo de 11 a las 21:05

  1. A menudo, una respuesta es usar nombres locales (variables) que se refieren a la instancia del objeto específico en cuestión (en el alcance de su bucle, por ejemplo). La semántica dinámica de enlace tardío de Python requiere que su intérprete recorra cada "." referencia cada vez porque los objetos a los que está vinculado cada uno de estos pueden haber sido cambiados por iteraciones anteriores a través de nuestro ciclo. Al igual que con la mayoría de los otros comentarios sobre el rendimiento, esto no hace mucha diferencia hasta que esté operando a gran escala (millones de iteraciones de bucle multiplicadas por varias capas de desreferencias ".")

  2. A veces, el mejor enfoque es repensar su diseño y utilizar objetos "más inteligentes". Con frecuencia, las sentencias switch / case se utilizan para implementar diferentes comportamientos dentro de una clase de objetos donde se pueden implementar varias clases relacionadas, cada una de las cuales "hace lo correcto" en función de su propio tipo. Otras veces, como sugiere el comentario, creará un diccionario ("hash") de claves y objetos (funciones, instancias, lambdas, lo que sea) y lo usará como tabla de despacho.

  3. Python le permite acceder a los atributos directamente (sin métodos getter / setter) y, si necesita hacerlo, puede usar propiedades para asegurarse de que su propio código (getter / setter) se ejecute implícitamente. Los usuarios de su código no tienen que saber ni preocuparse foo.bar=1 está vinculando directamente un nuevo valor a foo's bar atributo o si está llamando a un método de foo que está realizando alguna manipulación estatal internacional que sería visible al acceder foo.bar mas tarde. Esos son detalles de implementación. Hacer que el lenguaje anime a los programadores a implementar todas las referencias de objeto / atributo como llamadas explícitas ".get ()" y ".set ()" sin dejar de admitir más simple "." la sintaxis no confiere ningún beneficio al código; simplemente hace que el código sea más desordenado y más difícil de leer.

Sí, se puede acceder fácilmente a los atributos y métodos y "ocultarlos" es difícil. Facilita el uso del idioma. (El argumento contrario de que hace que las clases sean más fáciles de "abusar", es decir, que permite a los usuarios acceder a los detalles de implementación de una clase que no están destinados a ser públicos ... no los obliga a respetar el abstracciones. Ese es un punto discutible. Si su clase documenta la interfaz deseada y las implementa razonablemente, entonces esas son las interfaces que la mayoría de los programadores usarán. Si sienten la necesidad de jugar con los detalles de su implementación, probablemente lo hizo mal --- y su alternativa es simplemente volver a implementar lo que hizo para evitar las limitaciones que impuso).

contestado el 16 de mayo de 11 a las 22:05

  1. Quizás. No siempre es factible (o posible) para realizar importaciones específicas de esta manera.

  2. Las funciones lambda se desaconsejan por las razones normales por las que se desaconsejan las funciones lambda (no con todas las cuales estoy de acuerdo). bisect es una búsqueda binaria, por lo que es O (log N).

  3. "Recuperación de la adicción"

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.