Operador del rest de Python

¿Hay algún operador de rest en Python? No pido modulo operador, sino rest. Por ejemplo:

-5 mod 2 = 1 

pero

 -5 rem 2 = -1 # where "rem" is a remainder operator. 

¿Tengo que implementarlo por mí mismo?)?

En realidad, hay tres definiciones diferentes de “módulo” o “rest”, no dos:

  • Resto de división truncado: el signo es el mismo que el dividendo.
  • Resto de división de suelo: el signo es el mismo que el divisor.
  • Resto de la división euclidiana: el signo siempre es positivo.

Llamar a uno de ellos “módulo” y otro “rest” es muy confuso; los tres son definiciones útiles para ambos términos.

Casi todos los idiomas solo proporcionan uno de los tres (Fortran es una excepción notable). * La mayoría de los idiomas proporciona el que coincide con el operador de división del idioma. ** Debido a que Python utiliza la división de pisos (siguiendo el argumento de Knuth en El arte de la progtwigción de computadoras ), utiliza el operador del rest correspondiente.

Si quieres alguno de los otros, debes escribirlo manualmente. No es muy difícil; Este artículo de Wikipedia muestra cómo implementar los tres.

Por ejemplo:

 def trunc_divmod(a, b): q = a / b q = -int(-q) if q<0 else int(q) r = a - b * q return q, r 

Ahora, para su ejemplo:

 >>> q, r = trunc_divmod(-5, 2) >>> print(q, r) -2 -1 

* A menudo, los idiomas que proporcionan tanto el rest truncado como una variación en el mod y una variación en el rem ... pero eso definitivamente no es algo en lo que confiar. Por ejemplo, Fortran llama a modulo rest modulo , mientras que Scheme llama a mod rest euclidiano.

** Dos excepciones notables son C90 y C ++ 03, que dejan la opción a la implementación. Mientras que muchas implementaciones usan división truncada y el rest, algunas no lo hacen (algunas incluso usan división truncada y el rest del piso, lo que significa que a = b * (a/b) + a%b ni siquiera funciona ...).

Edición: no está del todo claro a qué se refería cuando pedía una operación de rest, la forma de hacerlo dependerá de los requisitos que haya sobre el signo de la salida.

Si el signo es siempre positivo, divmod puede hacer lo que quiera, está en la biblioteca estándar.

http://docs.python.org/2/library/functions.html#divmod

También es posible que desee ver los operadores aritméticos binarios incorporados:

http://docs.python.org/2/reference/expressions.html

Si el rest tiene que tener el mismo signo que el argumento pasado, tendrías que hacer rodar el tuyo como este:

 import math def rem(x,y): res = x % y return math.copysign(res,x) 

¿ math.fmod hace lo que estás buscando?