2010-05-21 15 views
16

que "accidentalmente" encontramos con este extraño, pero la sintaxis válida¿Por qué i ++++++++ soy válido en Python?

i=3 
print i+++i #outputs 6 
print i+++++i #outputs 6 
print i+-+i #outputs 0 
print i+--+i #outputs 6 

(por cada incluso no: del signo menos, se da salida a los demás 6 0, ¿por qué?)

hace esto algo útil?

Update (No lo tome mal way..I amor pitón): Uno de los principios de Python dice Debe haber uno-- y preferiblemente sólo una manera --obvious para hacerlo. Parece que hay formas infinitas de hacer i + 1

+3

¿Lo encontraste? En un concurso de codificación ofuscado? – extraneon

+1

-1: ¿Qué problema de programación tiene para que esta sea la solución? Tira el código, por favor. –

+1

Necesita volver a limpiar las migas de su teclado. –

Respuesta

28

Dado que Python no tiene operadores ++ o - del estilo C, se puede suponer que está anulando o positivando (?) El valor en el izquierda.

E.g. ¿qué esperarías que fuera i + +5?

i=3 
print i + +(+i) #outputs 6 
print i + +(+(+(+i))) #outputs 6 
print i + -(+i) #outputs 0 
print i + -(-(+i)) #outputs 6 

Cabe destacar que, desde el Python Grammar Specification, verá la línea:

factor: ('+'|'-'|'~') factor | power 

Lo que significa que un factor en una expresión puede ser un factor precedido por +, - o ~. Es decir. es recursivo, por lo que si 5 es un factor (que se debe a factor-> potencia-> NÚMERO), entonces -5 es un factor y también lo son --5 y --------5.

5

Los signos más se consideran operadores unarios a la variable más a la derecha i, como en + (- 3) = -3, o + (+ (+ 3))) = 3. Simplemente el signo más a la izquierda (más o menos) se analizan como binarios, por lo que i +++ i = i + (+ (+ i)), que se traduce en i + i = 3 + 3 = 6, en su ejemplo.

Las otras expresiones siguen el mismo principio.

5

Eso debe leer

print i + (+ (+i)) 

es decir, el primer signo es el operador de suma, los otros son signos infijas

+i 

y (por desgracia)

++i 

se por lo tanto, declaraciones válidas.

+2

Me gusta el último. ++ i es válido, simplemente no hace lo que hace en otros idiomas :) – extraneon

+0

¡Exactamente! (y un poco de miedo) – UncleZeiv

Cuestiones relacionadas