Was bewirkt das "%" in einer Berechnung? Ich kann nicht herausfinden, was es bewirkt.
Arbeitet es einen Prozentsatz der Berechnung aus, zum Beispiel: "4 % 2" ist offenbar gleich 0. Wie?
Der Operator % (modulo) liefert den Rest der Division des ersten Arguments durch das zweite. Die numerischen Argumente werden zunächst in einen gemeinsamen Typ konvertiert. Ein Argument mit Null rechts löst die Ausnahme ZeroDivisionError aus. Die Argumente können Fließkommazahlen sein, z. B. 3,14%0,7 ist gleich 0,34 (da 3,14 gleich 4*0,7 + 0,34 ist). Der Modulo-Operator liefert immer ein Ergebnis mit demselben Vorzeichen wie sein zweiter Operand (oder Null); der Absolutwert des Ergebnisses ist streng genommen kleiner als der Absolutwert des zweiten Operanden [2].
Entnommen aus http://docs.python.org/reference/expressions.html
Beispiel 1: 6%2" ergibt 0, weil es keinen Rest gibt, wenn 6 durch 2 geteilt wird (3 mal).
Beispiel 2: 7%2
ergibt 1
, weil es einen Rest von 1
gibt, wenn 7 durch 2 geteilt wird ( 3 mal ).
Zusammengefasst bedeutet das, dass es den Rest einer Divisionsoperation zurückgibt, oder 0
, wenn es keinen Rest gibt. Also bedeutet "6%2", dass man den Rest von 6 geteilt durch 2 findet.
Ein Ausdruck wie x % y
ergibt den Rest von x ÷ y
- nun, technisch gesehen ist es "Modulus" statt "Rest", so dass die Ergebnisse anders ausfallen können, wenn Sie mit anderen Sprachen vergleichen, in denen %
der Restoperator ist. [Es gibt einige subtile Unterschiede] (https://rob.conery.io/2018/08/21/mod-and-remainder-are-not-the-same/) (wenn Sie an den praktischen Konsequenzen interessiert sind, lesen Sie auch "Warum Python's Integer Division Floors" weiter unten).
Die Vorrangigkeit ist die gleiche wie bei den Operatoren /
(Division) und *
(Multiplikation).
>>> 9 / 2
4
>>> 9 % 2
1
%
auch der (veraltete) String-Interpolations-Operator. Passen Sie also auf, wenn Sie aus einer Sprache mit automatischer Typumwandlung (wie PHP oder JS) kommen, in der ein Ausdruck wie '12' % 2 + 3
legal ist: in Python führt er zu TypeError: not all arguments converted during string formatting
, was für Sie wahrscheinlich ziemlich verwirrend sein wird.
[Update für Python 3]
Benutzer n00p kommentiert:9/2 ist 4.5 in Python. Du musst eine ganzzahlige Division wie folgt durchführen: 9//2, wenn du willst, dass Python dir sagt, wie viele ganze Objekte nach Division(4) übrig sind. Um genau zu sein, war Ganzzahldivision in Python 2 der Standard (wohlgemerkt, diese Antwort ist älter als mein Junge, der schon in der Schule ist und zu der Zeit, als 2.x Mainstream war):
$ 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
In modernem Python ergibt 9 / 2
tatsächlich 4.5
:
$ 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
[update] Benutzer dahiya_boy fragte in der Kommentarsitzung:
Q. Können Sie bitte erklären, warum
-11 % 5 = 4
- dahiya_boy Das ist doch seltsam, oder? Wenn Sie dies in JavaScript versuchen:
> -11 % 5
-1
%
in JavaScript der "Rest" Operator ist, während es in Python der "Modulus" (Clock Math) Operator ist.Bearbeiten - dahiya_boy In Java und iOS ist
-11 % 5 = -1
, während in Python und Ruby-11 % 5 = 4
ist. Nun, die Hälfte des Grundes wird von Paulo Scardine erklärt, und der Rest der Erklärung ist hier unten In Java und iOS gibt%
den Rest an, d.h. wenn man 11 % 5 dividiert, ergibtQuotient = 2 und Rest = 1
und -11 % 5 ergibtQuotient = -2 und Rest = -1
. Beispielcode in swift iOS. [![Bildbeschreibung hier eingeben][1]][1] Aber wenn wir in Python darüber sprechen, gibt es den Taktmodul. Und es funktioniert mit der folgenden Formelmod(a,n) = a - {n * Floor(a/n)}
Das bedeutet,mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Also,mod(11,5) = 1
Undmod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
Also,mod(-11,5) = 4
Beispielcode in Python 3.0. [![Bildbeschreibung hier eingeben][2]][2]Warum Python's Integer Division Floors
Ich wurde heute (wieder) gebeten zu erklären, warum die Ganzzahldivision in Python den Boden des Ergebnisses zurückgibt, anstatt wie in C gegen Null abzuschneiden.
Für positive Zahlen gibt es keine Überraschung:
>>> 5//2
2
Aber wenn einer der Operanden negativ ist, wird das Ergebnis geglättet, d. h. von Null weg gerundet (gegen negativ unendlich):
>>> -5//2
-3
>>> 5//-2
-3
Dies stört einige Leute, aber es gibt einen guten mathematischen Grund. Die ganzzahlige Divisionsoperation (//) und ihre Schwester, die Modulo-Operation (%), passen zusammen und erfüllen eine schöne mathematische Beziehung (alle Variablen sind ganze Zahlen):
a/b = q with remainder r
so dass
b*q + r = a and 0 <= r < b
(unter der Annahme, dass a und b >= 0 sind).
Wenn man möchte, dass sich die Beziehung auf ein negatives a ausdehnt (wobei b positiv bleibt), hat man zwei Möglichkeiten: Wenn man q gegen Null abschneidet, wird r negativ, so dass die Invariante zu 0 <= abs(r) < wird; andernfalls kann man q gegen negativ unendlich abschneiden, und die Invariante bleibt 0 <= r < b. [Aktualisierung: diesen Absatz korrigiert]
In der mathematischen Zahlentheorie bevorzugen Mathematiker immer die letztere Variante (siehe z. B. [Wikipedia][3]). Für Python habe ich die gleiche Wahl getroffen, weil es einige interessante Anwendungen der Modulo-Operation gibt, bei denen das Vorzeichen von a uninteressant ist. Nehmen wir einen POSIX-Zeitstempel (Sekunden seit Beginn des Jahres 1970) und wandeln ihn in die Uhrzeit um. Da ein Tag 24*3600 = 86400 Sekunden hat, ist diese Berechnung einfach t % 86400. Würden wir jedoch Zeiten vor 1970 mit negativen Zahlen ausdrücken, würde die Regel "gegen Null abschneiden" ein sinnloses Ergebnis liefern! Mit der Floor-Regel geht alles gut.
Andere Anwendungen, an die ich gedacht habe, sind Berechnungen von Pixelpositionen in der Computergrafik. Ich bin sicher, es gibt noch mehr.
Für negatives b dreht sich übrigens alles um, und die Invariante wird:
0 >= r > b.
Warum also macht C das nicht so? Wahrscheinlich hat die Hardware das nicht getan, als C entwickelt wurde. Und die Hardware hat es wahrscheinlich nicht so gemacht, weil in der ältesten Hardware negative Zahlen als "Vorzeichen + Betrag" dargestellt wurden und nicht als Zweierkomplement, wie man es heute verwendet (zumindest für ganze Zahlen). Mein erster Computer war ein Großrechner von Control Data, der sowohl für ganze Zahlen als auch für Gleitkommazahlen das Einerkomplement verwendete. Ein Muster von 60 Einsen bedeutete eine negative Null!
Tim Peters, der weiß, wo alle Fließkomma-Skelette von Python vergraben sind, hat sich besorgt über meinen Wunsch geäußert, diese Regeln auf Fließkomma modulo auszuweiten. Wahrscheinlich hat er recht; die Regel truncate-towards-negative-infinity kann einen Präzisionsverlust für x%1.0 verursachen, wenn x eine sehr kleine negative Zahl ist. Aber das ist für mich nicht genug, um Integer Modulo zu brechen, und // ist eng damit verbunden.
PS. Beachten Sie, dass ich // anstelle von / verwende - dies ist die Syntax von Python 3 und auch in Python 2 erlaubt, um zu betonen, dass Sie wissen, dass Sie eine ganzzahlige Division aufrufen. Der Operator / in Python 2 ist mehrdeutig, da er für zwei Integer-Operanden ein anderes Ergebnis liefert als für einen int und einen float oder zwei floats. Aber das ist eine ganz andere Geschichte; siehe PEP 238.
Geschrieben von Guido van Rossum um 9:49 AM
Modulus-Operator, wird normalerweise für die Restdivision von Ganzzahlen verwendet, kann aber in Python auch für Fließkommazahlen verwendet werden.
http://docs.python.org/reference/expressions.html
Der Operator % (Modulo) liefert den Rest der Division des ersten Arguments durch das zweite. Die numerischen Argumente werden zunächst in einen gemeinsamen Typ umgewandelt. Ein Argument mit Null rechts löst die Ausnahme ZeroDivisionError aus. Die Argumente können Fließkommazahlen sein, z. B. 3,14%0,7 ist gleich 0,34 (da 3,14 gleich 4*0,7 + 0,34 ist). Der Modulo-Operator liefert immer ein Ergebnis mit demselben Vorzeichen wie sein zweiter Operand (oder Null); der Absolutwert des Ergebnisses ist streng genommen kleiner als der Absolutwert des zweiten Operanden [2].