¿Cuál es la razón para tener '//' en Python? [duplicar]

Resuelto Pete asked hace 14 años • 0 respuestas

Vi esto en el código de alguien:

y = img_index // num_images

donde img_indexes un índice en ejecución y num_imageses 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.

Pete avatar Oct 08 '09 11:10 Pete
Aceptado

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 .

Mark Rushakoff avatar Oct 08 '2009 04:10 Mark Rushakoff

//es incondicionalmente "división de pisos", por ejemplo:

>>> 4.0//1.5
2.0

Como puede ver, aunque ambos operandos son floats, // 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 -Qbandera...;-).

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!-)

Alex Martelli avatar Oct 08 '2009 04:10 Alex Martelli