Cosa fa il %
in un calcolo? Non riesco a capire cosa fa.
Lavora una percentuale del calcolo per esempio: 4 % 2
è apparentemente uguale a 0. Come?
L'operatore % (modulo) produce il resto della divisione del primo argomento per il secondo. Gli argomenti numerici sono prima convertiti in un tipo comune. Un argomento zero a destra solleva l'eccezione ZeroDivisionError. Gli argomenti possono essere numeri in virgola mobile, ad esempio, 3,14%0,7 è uguale a 0,34 (poiché 3,14 è uguale a 4*0,7 + 0,34.) L'operatore modulo produce sempre un risultato con lo stesso segno del suo secondo operando (o zero); il valore assoluto del risultato è strettamente inferiore al valore assoluto del secondo operando [2].
Tratto da http://docs.python.org/reference/expressions.html
Esempio 1:
6%2
valuta a 0
perché non c'è nessun resto se 6 è diviso per 2 (3 volte).
Esempio 2: 7%2
valuta a 1
perché c'è un resto di 1
quando 7 è diviso per 2 (3 volte).
Quindi, per riassumere, restituisce il resto di un'operazione di divisione, o 0
se non c'è alcun resto. Quindi 6%2
significa trovare il resto di 6 diviso per 2.
Un'espressione come x % y
valuta il resto di x ÷ y
- beh, tecnicamente è "modulo" invece di "resto" quindi i risultati possono essere diversi se si confrontano con altri linguaggi dove %
è l'operatore di resto. Ci sono alcune sottili differenze (se sei interessato alle conseguenze pratiche vedi anche "Perché la divisione di interi di Python" è un fallimento" sotto).
La precedenza è la stessa degli operatori /
(divisione) e *
(moltiplicazione).
>>> 9 / 2
4
>>> 9 % 2
1
%
è anche l'operatore (deprecato) di interpolazione delle stringhe, quindi fate attenzione se venite da un linguaggio con type casting automatico (come PHP o JS) dove un'espressione come '12' % 2 + 3
è legale: in Python risulterà in TypeError: not all arguments converted during string formatting
che probabilmente vi confonderà parecchio.
[aggiornamento per Python 3]
Commenti dell'utente n00p:
9/2 è 4.5 in Python. Devi fare la divisione intera in questo modo: 9//2 se volete che Python vi dica quanti oggetti interi sono rimasti dopo la divisione(4).
Per essere precisi, la divisione di interi era il default in Python 2 (attenzione, questa risposta è più vecchia di mio figlio che è già a scuola e al tempo 2.x erano mainstream):$ 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
Nel Python moderno 9 / 2
risulta 4.5
infatti:
$ 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
[aggiornamento] L'utente dahiya_boy ha chiesto nella sessione dei commenti:
Q. Puoi per favore spiegare perché
-11 % 5 = 4
- dahiya_boy Questo è strano, vero? Se provi questo in JavaScript:
> -11 % 5
-1
%
è l'operatore "remainder" mentre in Python è l'operatore "modulus" (clock math).Modifica - dahiya_boy In Java e iOS
-11 % 5 = -1
mentre in python e ruby-11 % 5 = 4
. Beh, metà della ragione è spiegata da Paulo Scardine, e il resto della spiegazione è qui sotto In Java e iOS,%
dà il resto che significa che se si divide 11 % 5 dàQuotiente = 2 e resto = 1
e -11 % 5 dàQuotiente = -2 e resto = -1
. Codice di esempio in swift iOS. [![inserire descrizione immagine qui][1]][1] Ma quando parliamo in python il suo dà il modulo dell'orologio. E il suo lavoro con la seguente formulamod(a,n) = a - {n * Floor(a/n)}
Questo significa che,mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Quindi,mod(11,5) = 1
Emod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
Quindi,mod(-11,5) = 4
Codice di esempio in python 3.0. [![inserire descrizione immagine qui][2]][2]Perché Python's Integer Division Floors
Mi è stato chiesto (di nuovo) oggi di spiegare perché la divisione di interi in Python restituisce il floor del risultato invece di troncare verso lo zero come in C.
Per i numeri positivi, non c'è una sorpresa:
>>> 5//2
2
Ma se uno degli operandi è negativo, il risultato è flottante, cioè arrotondato lontano da zero (verso l'infinito negativo):
>>> -5//2
-3
>>> 5//-2
-3
Questo disturba alcune persone, ma c'è una buona ragione matematica. L'operazione di divisione intera (//) e la sua sorella, l'operazione modulo (%), vanno insieme e soddisfano una bella relazione matematica (tutte le variabili sono interi):
a/b = q with remainder r
tale che
b*q + r = a and 0 <= r < b
(supponendo che a e b siano >= 0).
Se vuoi che la relazione si estenda per a negativo (mantenendo b positivo), hai due scelte: se tronchi q verso zero, r diventerà negativo, così che l'invariante cambia in 0 <= abs(r) < altrimenti, puoi pavimentare q verso l'infinito negativo, e l'invariante rimane 0 <= r <b. [update: fixed this para]
Nella teoria matematica dei numeri, i matematici preferiscono sempre la seconda scelta (vedi ad esempio [Wikipedia][3]). Per Python, ho fatto la stessa scelta perché ci sono alcune interessanti applicazioni dell'operazione modulo dove il segno di a non è interessante. Considerate di prendere un timestamp POSIX (secondi dall'inizio del 1970) e trasformarlo nell'ora del giorno. Poiché ci sono 24*3600 = 86400 secondi in un giorno, questo calcolo è semplicemente t % 86400. Ma se dovessimo esprimere i tempi prima del 1970 usando numeri negativi, la regola "truncate towards zero" darebbe un risultato senza senso! Usando la regola del pavimento tutto funziona bene.
Altre applicazioni a cui ho pensato sono i calcoli delle posizioni dei pixel nella computer grafica. Sono sicuro che ce ne sono altre.
Per b negativo, comunque, tutto si capovolge, e l'invariante diventa:
0 >= r > b.
Allora perché C non lo fa in questo modo? Probabilmente l'hardware non lo faceva al tempo in cui il C è stato progettato. E l'hardware probabilmente non lo faceva in questo modo perché nell'hardware più vecchio, i numeri negativi erano rappresentati come "segno + magnitudine" piuttosto che la rappresentazione a due complementi utilizzata in questi giorni (almeno per gli interi). Il mio primo computer era un mainframe Control Data e usava il complemento a uno per gli interi e i float. Un modello di 60 uno significava zero negativo!
Tim Peters, che sa dove sono sepolti tutti gli scheletri di Python'in virgola mobile, ha espresso qualche preoccupazione riguardo al mio desiderio di estendere queste regole al modulo in virgola mobile. Probabilmente ha ragione; la regola del troncamento verso l'infinito negativo può causare una perdita di precisione per x%1.0 quando x è un numero negativo molto piccolo. Ma questo non è abbastanza per me per rompere il modulo intero, e // è strettamente accoppiato a questo.
PS. Notate che sto usando // invece di / -- questa è la sintassi di Python 3, e consentita anche in Python 2 per sottolineare che si sa che si sta invocando la divisione intera. L'operatore / in Python 2 è ambiguo, poiché restituisce un risultato diverso per due operandi interi che per un int e un float o due float. Ma questa è una storia completamente separata; vedere PEP 238.
Postato da Guido van Rossum alle 9:49 AM
Operatore di modulo, è usato per la divisione del resto sui numeri interi, tipicamente, ma in Python può essere usato per i numeri in virgola mobile.
http://docs.python.org/reference/expressions.html
L'operatore % (modulo) produce il resto dalla divisione del primo argomento per il secondo. Gli argomenti numerici sono prima convertiti in un tipo comune. Un argomento zero a destra solleva l'eccezione ZeroDivisionError. Gli argomenti possono essere numeri in virgola mobile, ad esempio, 3,14%0,7 è uguale a 0,34 (poiché 3,14 è uguale a 4*0,7 + 0,34.) L'operatore modulo produce sempre un risultato con lo stesso segno del suo secondo operando (o zero); il valore assoluto del risultato è strettamente inferiore al valore assoluto del secondo operando [2].