En comparación con lenguajes como Perl, Python tiene un número limitado de construcciones de control:
- única
if
y no hay unless
,
- solo
for
que itera sobre secuencias y no foreach
o estilo C for
,
- solo
while
eso comprueba una condición en cada bucle y no do-while
,
- única
if-elif
y no hay switch
,
- solo hay una construcción de comentario, el
#
, y para cada línea puedes decir si está comentado o no, sin mirar las líneas anteriores.
Además, hay casi una forma de sangrar su fuente; La mayoría de los casos de sangría creativa se excluyen sintácticamente.
Esto hace que analizar una fuente de Python sea más fácil para los humanos.
Hay intentos de ser mínimos pero completos en los tipos integrados y en la biblioteca estándar.
- para la lista mutable, usa el único tipo incorporado
list
; es O (1) para la mayoría de las operaciones, y nunca tiene que elegir la implementación correcta,
- para listas inmutables, igualmente, solo usa el
tuple
tipo,
- para los mapas, usa el único incorporado
dict
que es muy eficiente en la mayoría de los casos, sin necesidad de considerar qué implementación usar.
Python 3 extiende esto a los enteros: no importa qué tan grande sea su entero, usted usa el mismo tipo y nunca le importa la coerción.
Python intenta evitar el azúcar sintáctico. Pero a veces agrega azúcar sintáctico solo para hacer obvio el camino obvio. Puede escribir en if foo is not None
lugar de if not (foo is None)
porque 'no es' está en mayúsculas especiales. Todavía se foo is not None
lee fácilmente, no se puede malinterpretar, y no tienes que pensar, solo escribes lo obvio.
Por supuesto, la mayoría de las cosas más complejas en Python se pueden hacer de varias maneras. Puede agregar métodos a las clases por declaración o por asignación simple de ranuras, puede pasar argumentos a las funciones de varias maneras creativas, etc. Eso es solo porque los aspectos internos del lenguaje están expuestos en su mayoría.
La clave es que siempre hay una manera que pretende ser la mejor, el caso de cubrir todo. Si existen otras formas, no se agregaron como alternativas iguales (como if
y unless
) sino que simplemente exponen el funcionamiento interno. Lenta pero constantemente, tales alternativas quedan obsoletas (¡no se eliminan!) Al mejorar el mejor mecanismo conocido.
Los decoradores envuelven las llamadas de función AOP. Antes de 2.6, tenía que usar el __metaclass__
miembro mágico para declarar la metaclase de una clase; ahora también puede usar la misma sintaxis de decorador para esto. Antes de 3.0, tenía dos tipos de cadenas, orientadas a bytes y Unicode, que podía mezclar inadvertidamente. Ahora tiene el único Unicode str
y el único binario transparente bytes
, que no puede mezclar por error.
"""
comentarios (docstrings). Estos abarcan varias líneas.__doc__
atributo. Pero las cadenas es un área donde Python sin duda ofrece muchas formas correctas '': el uso de comillas simples, dobles o triples, implícitamente, se unen a los literales adyacentes, el usor
de literales primas, etc.Otro par de ejemplos son:
len()
es una función en lugar de un método presente en cada secuencia; si se compara con Java que tiene.length
,.size()
,.getSize()
, y otros métodos para encontrar el número de elementos en una secuencia.Otro ejemplo es el hecho de que
.join()
es unstring
método, no un método presente en cada secuencia. No necesita saber si el parámetro de unión es una lista, un conjunto, una comprensión o lo que sea, funcionará.fuente
En C hay muchas formas posibles de aumentar el valor de una variable en uno:
Cada uno termina aumentando el valor de
i
by1
, pero cada uno es ligeramente diferente.En Python, en realidad solo hay una forma; solo agrega uno.
Y aunque hay más de una forma sintácticamente válida de hacer esto (por ejemplo
i = i + 1
), estás haciendo lo mismo con los mismos efectos secundarios.fuente
i = i + 1
es una asignación, no un incremento. En python un incremento esi += 1
. En lenguajes de tipo C se puede escribiri++
,++i
yi += 1
.i += 1
, por cierto) producen exactamente el mismo resultado. La única vez que veo que las personas se confunden es cuando incrementan o reducen una variable como parte de una expresión más grande, y eso generalmente se rectifica rápidamente al leer la sección correspondiente de la referencia del lenguaje. Personalmente, habría elegido el hecho de que puede referirse al quinto carácter de una cadena por ambosstr[4]
o*(str+4)
, pero tal vez eso fue demasiado fácil ...max(i++, ++i)
no se pueden rectificar rápidamente. C tiene muchos casos de comportamiento "indefinidos" y "dependientes de la implementación", todos por una buena razón, pero cada uno puede crear una trampa.Otra posibilidad podría ser la lista de comprensiones. En Python, podrías hacer esto:
Pero la forma "obvia" (si eres holandés o estás más familiarizado con Python) de hacerlo sería con una comprensión de la lista:
Es más corto, la nueva_lista se crea en un solo paso, se ejecuta más rápido, creo, y es elegante. En el lado negativo, uno podría argumentar que se siente menos explícito, pero creo que una vez que te acostumbras, es igual de explícito.
fuente