¿Cómo funciona % en Python?


¿Qué hace el % en un cálculo? Parece que no puedo entender lo que hace.

Se resuelve un porcentaje del cálculo por ejemplo: 3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6 es aparentemente igual a 7. ¿Cómo?

Author: User that is not a user, 2010-12-13

18 answers

El operador % (módulo) produce el resto de la división del primer argumento por el segundo. Los argumentos numéricos se convierten primero a un tipo común. Un argumento zero right genera la excepción ZeroDivisionError. Los argumentos pueden ser números en coma flotante, por ejemplo, 3.14% 0.7 es igual a 0.34 (ya que 3.14 es igual a 4*0.7 + 0.34.) El operador modulo siempre produce un resultado con el mismo signo que su segundo operando (o cero); el valor absoluto del resultado es estrictamente menor que el valor absoluto del segundo operando [2].

Tomado de http://docs.python.org/reference/expressions.html

Ejemplo 1: 6%2 evalúa a 0 porque no hay resto si 6 se divide por 2 ( 3 veces ).

Ejemplo 2: 7%2 evalúa a 1 porque hay un resto de 1 7 cuando se divide por 2 ( 3 veces ).

Para resumir, devuelve el resto de una operación de división, o 0 si no hay resto. Así que 6%2 significa encontrar el resto de 6 dividido por 2.

 205
Author: meder omuraliev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:39:56

Algo fuera de tema, el % también se usa en operaciones de formato de cadena como %= para sustituir valores en una cadena:

>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x 
'abc_value_'

Nuevamente, fuera del tema, pero parece ser una característica poco documentada que me llevó un tiempo rastrear, y Pensé que estaba relacionada con el cálculo del módulo de Pitones para el cual esta página ocupa un lugar destacado.

 109
Author: mrmagooey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-15 00:58:08

El módulo es una operación matemática, a veces descrita como "aritmética de reloj"."Encuentro que describirlo como simplemente un resto es engañoso y confuso porque enmascara la verdadera razón por la que se usa tanto en ciencias de la computación. Realmente se utiliza para envolver alrededor de los ciclos.

Piense en un reloj: Supongamos que mira un reloj en tiempo "militar", donde el rango de tiempos va de 0:00 a 23.59. Ahora, si quisieras que algo pasara todos los días a medianoche, querrías que la corriente tiempo mod 24 para ser cero:

If (hora % 24 == 0):

Puedes pensar en todas las horas de la historia envolviendo alrededor de un círculo de 24 horas una y otra vez y la hora actual del día es ese número infinitamente largo mod 24. Es un concepto mucho más profundo que solo un resto, es una forma matemática de lidiar con los ciclos y es muy importante en ciencias de la computación. También se utiliza para envolver alrededor de matrices, lo que le permite aumentar el índice y utilizar el módulo para envolver de nuevo a la comenzando después de llegar al final de la matriz.

 36
Author: jarvis01123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 19:41:05

Una expresión como 'x % y' se evalúa como el resto de 'x / y'. Las reglas de precedencia son como ' / 'y'*'.

>>> 9 / 2
4
>>> 9 % 2
1
  • 9 dividido por 2 es igual a 4.
  • 4 veces 2 es 8
  • 9 menos 8 es 1 - el resto.

Python gotcha : dependiendo de la versión de Python que esté utilizando, % también es el operador de interpolación de cadenas (obsoleto), así que tenga cuidado si viene de un lenguaje con casting de tipo automático (como PHP o JS) donde un expresión como '12' % 2 + 3 es legal: en Python dará lugar a TypeError: not all arguments converted during string formatting que probablemente será bastante confuso para usted.

[actualización para Python 3]

Usuario n00p comentarios:

9/2 es 4.5 en python. Tienes que hacer la división entera así: 9 / / 2 si quieres que python te diga cuántos objetos enteros quedan después de la división (4).

Para ser precisos, la división entera solía ser la predeterminada en Python 2:

$ python2.7
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4
>>> 9 // 2
4
>>> 9 % 2
1

En Python 3 ahora 9 / 2 resultados 4.5 de hecho, pero tenga en cuenta que la respuesta original es muy antigua.

$ python3.6
Python 3.6.1 (default, Apr 27 2017, 00:15:59)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4.5
>>> 9 // 2
4
>>> 9 % 2
1
 33
Author: Paulo Scardine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-25 04:05:52

En la mayoría de los idiomas % se utiliza para módulo. Python no es una excepción.

 9
Author: Sorpigal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:34:29

Python - Operadores Básicos
http://www.tutorialspoint.com/python/python_basic_operators.htm

Modulus-Divide el operando de la mano izquierda por el operando de la mano derecha y devuelve el resto

A = 10 y b = 20

B % a = 0

 9
Author: Halil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-14 13:05:24

También, hay una útil función incorporada llamada divmod:

Divmod(a, b)

Tome dos números (no complejos) como argumentos y devuelva un par de números consisting of their quotient and resto cuando se usa división larga.

 4
Author: warvariuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 20:45:24

x % y calcula el resto de la división x dividido por y donde el cociente es un número entero. El resto tiene el signo de y.


En Python 3 el cálculo produce 6.75; esto se debe a que el / hace una división verdadera, no una división entera como (por defecto) en Python 2. En Python 2 1 / 4 da 0, ya que el resultado se redondea hacia abajo.

La división entera se puede hacer en Python 3 también, con el operador //, por lo tanto para obtener el 7 como resultado, puedes ejecutar:

3 + 2 + 1 - 5 + 4 % 2 - 1 // 4 + 6

Además, puede obtener la división de estilo Python en Python 2, simplemente agregando la línea

from __future__ import division

Como la primera línea de código fuente en cada archivo fuente.

 4
Author: Antti Haapala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 08:26:00

Operador de módulo, se usa para la división de remanentes en enteros, típicamente, pero en Python se puede usar para números de coma flotante.

Http://docs.python.org/reference/expressions.html

El operador % (módulo) produce el resto de la división del primer argumento por el segundo. Los argumentos numéricos se convierten primero a un tipo común. Un argumento zero right genera la excepción ZeroDivisionError. Los argumentos pueden ser números en coma flotante, por ejemplo, 3.14% 0.7 es igual a 0.34 (ya que 3.14 es igual a 4*0.7 + 0.34.) El operador modulo siempre produce un resultado con el mismo signo que su segundo operando (o cero); el valor absoluto del resultado es estrictamente menor que el valor absoluto del segundo operando [2].

 3
Author: wkl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:33:36

Es una operación modulo, excepto cuando es un antiguo operador de formato de cadena de estilo C, no una operación modulo . Ver aquí para más detalles. Verás mucho de esto en el código existente.

 3
Author: John Machin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:47:40

Tenga en cuenta que

(3+2+1-5) + (4%2) - (1/4) + 6

Incluso con los corchetes resulta en 6.75 en lugar de 7 si se calcula en Python 3.4.


Y el operador '/' no es tan fácil de entender, también (python2.7): try...

- 1/4

1 - 1/4

Esto es un poco fuera de tema aquí, pero debe considerarse al evaluar la expresión anterior:)

 2
Author: bernhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-16 16:06:37

% Modulo operator también se puede usar para imprimir cadenas (al igual que en C) como se define en Google https://developers.google.com/edu/python/strings .

      # % operator
  text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')

Esto parece un poco fuera de tema, pero sin duda ayudará a alguien.

 2
Author: Harshit Chaudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-21 18:31:57

Es, como en muchos lenguajes similares a C, la operación resto o módulo. Consulte la documentación para los tipos numéricos: int, float, long, complex.

 1
Author: Andrew Jaffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-17 12:51:42

Modulus - Divide el operando de la mano izquierda por el operando de la mano derecha y devuelve el resto.

Si ayuda:

1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true

... y así sucesivamente.

 1
Author: gr8scott06,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-28 22:32:44

El operador % (módulo) produce el resto de la división del primer argumento por el segundo. Los argumentos numéricos se convierten primero a un tipo común.

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6 = 7

Esto se basa en la precedencia del operador.

 0
Author: user225312,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:35:25

% is modulo . 3 % 2 = 1, 4 % 2 = 0

/ es (un entero en este caso) división, así que:

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6
1 + 4%2 - 1/4 + 6
1 + 0 - 0 + 6
7
 0
Author: khachik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:36:12

Es una operación modulo http://en.wikipedia.org/wiki/Modulo_operation

Http://docs.python.org/reference/expressions.html

Así que con el orden de las operaciones, que funciona a

(3+2+1-5) + (4%2) - (1/4) + 6

(1) + (0) - (0) + 6

7

El 1/4=0 porque estamos haciendo matemáticas enteros aquí.

 0
Author: Marc Hughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 18:37:27

Fue difícil para mí encontrar fácilmente casos de uso específicos para el uso de % online ,por ejemplo, por qué hacer división de módulo fraccional o división de módulo negativo resulta en la respuesta que lo hace. Espero que esto ayude a aclarar preguntas como esta:

División De Módulos En General:

Modulus division devuelve el resto de una operación de división matemática. Es lo hace de la siguiente manera:

Digamos que tenemos un dividendo de 5 y divisor de 2, la siguiente división la operación sería (igual a x):

dividend = 5
divisor = 2

x = 5/2 
  1. El primer paso en el cálculo del módulo es realizar la división entera:

    X_int = 5 / / 2 (la división entera en python usa doble barra)

    X_int = 2

  2. A continuación, la salida de x_int se multiplica por el divisor:

    X_mult = x_int * divisor x_mult = 4

  3. Por último, el dividendo se resta del x_mult

    Dividendo-x_mult = 1

  4. La operación de módulo, por lo tanto, devuelve 1:

    5 % 2 = 1

Aplicación para aplicar el módulo a una fracción

Example: 2 % 5 

El cálculo del módulo cuando se aplica a una fracción es el mismo que el anterior; sin embargo, es importante tener en cuenta que la división entera dará como resultado un valor de cero cuando el divisor es mayor que el dividendo:

dividend = 2 
divisor = 5

La división entera resulta en 0 mientras que; por lo tanto, cuando se realiza el paso 3 anterior, el valor del dividendo se lleva a cabo (restado de cero):

dividend - 0 = 2  —> 2 % 5 = 2 

Aplicación para aplicar el módulo a un negativo

La división de piso ocurre en la que el valor de la división entera se redondea hacia abajo al valor entero más bajo:

import math 

x = -1.1
math.floor(-1.1) = -2 

y = 1.1
math.floor = 1

Por lo tanto, cuando usted hace la división entera puede obtener un resultado diferente de lo que espera!

Aplicando los pasos anteriores al siguiente dividendo y divisor ilustra el concepto de módulo:

dividend: -5 
divisor: 2 

Paso 1: Aplicar la división entera

x_int = -5 // 2  = -3

Paso 2: Multiplique el resultado de la división entera por el divisor

x_mult = x_int * 2 = -6

Paso 3: Reste el dividendo de la variable multiplicada, observe la doble negativa.

dividend - x_mult = -5 -(-6) = 1

Por lo tanto:

-5 % 2 = 1
 0
Author: N.Atanasov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 02:23:53