¿Cuál es la razón para tener '//' en Python? [duplicar]
Vi esto en el código de alguien:
y = img_index // num_images
donde img_index
es un índice en ejecución y num_images
es 3.
Cuando juego con //
IPython , parece actuar como un signo de división (es decir, una barra diagonal). Me preguntaba si hay alguna razón para tener barras diagonales dobles.
En Python 3, hicieron que el /
operador hiciera una división de punto flotante y agregaron el //
operador para hacer una división de enteros (es decir, cociente sin resto); mientras que en Python 2, el /
operador era simplemente una división de enteros, a menos que uno de los operandos ya fuera un número de coma flotante.
En Python 2.X:
>>> 10/3
3
>>> # To get a floating point number from integer division:
>>> 10.0/3
3.3333333333333335
>>> float(10)/3
3.3333333333333335
En Python 3:
>>> 10/3
3.3333333333333335
>>> 10//3
3
Para obtener más referencia, consulte PEP238 .
//
es incondicionalmente "división de pisos", por ejemplo:
>>> 4.0//1.5
2.0
Como puede ver, aunque ambos operandos son float
s, //
siguen siendo pisos, por lo que siempre sabrá con seguridad qué va a hacer.
Un solo nivel /
puede o no depender del lanzamiento de Python, importaciones futuras e incluso indicadores en los que se ejecuta Python, por ejemplo:
$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667
Como puede ver, un solo /
puede piso, o puede devolver un flotante, basado en cuestiones completamente no locales, hasta e incluyendo el valor de la -Q
bandera...;-).
Por lo tanto, cuando sepa que quiere un suelo, utilice siempre//
, que lo garantiza. Si sabe que no quiere piso, coloque un float()
alrededor de otro operando y use /
. ¡Cualquier otra combinación y estarás a merced de la versión, las importaciones y las banderas!-)