Τι σημαίνει το %
σε έναν υπολογισμό; Δεν μπορώ να καταλάβω τι κάνει.
Βγάζει ένα ποσοστό του υπολογισμού για παράδειγμα: 4 % 2
είναι προφανώς ίσο με 0. Πώς;
Ο τελεστής % (modulo) δίνει το υπόλοιπο από τη διαίρεση του πρώτου ορίσματος με το δεύτερο. Τα αριθμητικά ορίσματα μετατρέπονται πρώτα σε κοινό τύπο. Ένα μηδενικό δεξιό όρισμα προκαλεί την εξαίρεση ZeroDivisionError. Τα ορίσματα μπορεί να είναι αριθμοί κινητής υποδιαστολής, π.χ. 3,14%0,7 ισούται με 0,34 (αφού 3,14 ισούται με 4*0,7 + 0,34.) Ο τελεστής modulo δίνει πάντα ένα αποτέλεσμα με το ίδιο πρόσημο με το δεύτερο τελεστέο του (ή μηδέν)- η απόλυτη τιμή του αποτελέσματος είναι αυστηρά μικρότερη από την απόλυτη τιμή του δεύτερου τελεστή [2].
Λαμβάνεται από το http://docs.python.org/reference/expressions.html
Παράδειγμα 1:
Το 6%2
αξιολογείται ως 0
επειδή δεν υπάρχει υπόλοιπο αν το 6 διαιρεθεί με το 2 ( 3 φορές ).
Παράδειγμα 2: 7%2
αξιολογείται σε 1
επειδή υπάρχει υπόλοιπο 1
όταν το 7 διαιρείται με το 2 ( 3 φορές ).
Έτσι, για να συνοψίσουμε ότι, επιστρέφει το υπόλοιπο μιας πράξης διαίρεσης, ή 0
αν δεν υπάρχει υπόλοιπο. Έτσι, 6%2
σημαίνει να βρείτε το υπόλοιπο του 6 διαιρεμένο με το 2.
Μια έκφραση όπως x % y
αξιολογείται ως το υπόλοιπο του x ÷ y
- καλά, τεχνικά είναι "modulus" αντί για "reminder" οπότε τα αποτελέσματα μπορεί να είναι διαφορετικά αν συγκρίνετε με άλλες γλώσσες όπου το %
είναι ο τελεστής υπολοίπου. Υπάρχουν κάποιες λεπτές διαφορές (αν ενδιαφέρεστε για τις πρακτικές συνέπειες δείτε επίσης "Why Python's Integer Division Floors" παρακάτω).
Η προτεραιότητα είναι η ίδια με τους τελεστές /
(διαίρεση) και *
(πολλαπλασιασμός).
>>> 9 / 2
4
>>> 9 % 2
1
%
είναι επίσης ο (απαρχαιωμένος) τελεστής παρεμβολής συμβολοσειρών, οπότε προσέξτε αν έρχεστε από μια γλώσσα με αυτόματη μετατροπή τύπου (όπως η PHP ή η JS) όπου μια έκφραση όπως '12' % 2 + 3
είναι νόμιμη: στην Python θα οδηγήσει σε TypeError: not all arguments converted during string formatting
που πιθανόν να σας μπερδέψει αρκετά.
[ενημέρωση για την Python 3]
Σχόλια χρήστη n00p:9/2 είναι 4.5 στην Python. Πρέπει να κάνετε ακέραια διαίρεση ως εξής: 9//2 αν θέλετε η python να σας πει πόσα ολόκληρα αντικείμενα απομένουν μετά τη διαίρεση(4). Για την ακρίβεια, η ακέραια διαίρεση ήταν η προεπιλογή στην Python 2 (προσέξτε, αυτή η απάντηση είναι παλαιότερη από το αγόρι μου που είναι ήδη στο σχολείο και την εποχή που οι 2.x ήταν 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
Στη σύγχρονη Python το 9 / 2
οδηγεί πράγματι στο 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
[ενημέρωση] Ο χρήστης dahiya_boy ρώτησε στη συνεδρία σχολιασμού:
Q. Μπορείτε παρακαλώ να εξηγήσετε γιατί
-11 % 5 = 4
- dahiya_boy Αυτό είναι περίεργο, σωστά; Αν το δοκιμάσετε αυτό σε JavaScript:
> -11 % 5
-1
%
είναι ο τελεστής "υπόλοιπο" ενώ στην Python είναι ο τελεστής "modulus" (clock math).Επεξεργασία - dahiya_boy Στην Java και το iOS
-11 % 5 = -1
ενώ στην python και το ruby-11 % 5 = 4
. Λοιπόν, ο μισός λόγος εξηγείται από τον Paulo Scardine, και η υπόλοιπη εξήγηση βρίσκεται παρακάτω Στη Java και το iOS, το%
δίνει το υπόλοιπο, δηλαδή αν διαιρέσετε 11 % 5 δίνειQuotient = 2 και υπόλοιπο = 1
και -11 % 5 δίνειQuotient = -2 και υπόλοιπο = -1
. Δείγμα κώδικα σε swift iOS. [![εισάγετε την περιγραφή της εικόνας εδώ][1]][1][1] Αλλά όταν μιλάμε για σε python του δίνει modulus ρολογιού. Και λειτουργεί με τον παρακάτω τύποmod(a,n) = a - {n * Floor(a/n)}
Αυτό σημαίνει,mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Άρα,mod(11,5) = 1
Καιmod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}`` Άρα,
mod(-11,5) = 4` Δείγμα κώδικα σε python 3.0. [![εισάγετε την περιγραφή της εικόνας εδώ][2]][2][2]Γιατί τα δάπεδα διαίρεσης ακέραιων αριθμών της Python's
>, Μου ζητήθηκε (πάλι) σήμερα να εξηγήσω γιατί η διαίρεση ακεραίων στην Python επιστρέφει το κατώτατο όριο του αποτελέσματος αντί να κόβει προς το μηδέν όπως η C. >, Για τους θετικούς αριθμούς, δεν υπάρχει καμία έκπληξη: >,
>>> 5//2
2
Αλλά αν ένας από τους τελεστές είναι αρνητικός, το αποτέλεσμα πέφτει στο πάτωμα, δηλαδή στρογγυλοποιείται μακριά από το μηδέν (προς το αρνητικό άπειρο):
>>> -5//2
-3
>>> 5//-2
-3
Αυτό ενοχλεί μερικούς ανθρώπους, αλλά υπάρχει ένας καλός μαθηματικός λόγος. Η πράξη διαίρεσης ακεραίων (//) και το αδελφάκι της, η πράξη modulo (%), πάνε μαζί και ικανοποιούν μια ωραία μαθηματική σχέση (όλες οι μεταβλητές είναι ακέραιοι):
a/b = q with remainder r
έτσι ώστε
b*q + r = a and 0 <= r < b
(υποθέτοντας ότι τα a και b είναι >= 0). >, Αν θέλετε η σχέση να επεκταθεί για αρνητικό a (διατηρώντας το b θετικό), έχετε δύο επιλογές: αν κόψετε το q προς το μηδέν, το r θα γίνει αρνητικό, οπότε το αναλλοίωτο αλλάζει σε 0 <= abs(r) <- αλλιώς, μπορείτε να κόψετε το q προς το αρνητικό άπειρο, και το αναλλοίωτο παραμένει 0 <= r <- b. [ενημέρωση: διορθώθηκε αυτή η παράγραφος]. >, Στη μαθηματική θεωρία αριθμών, οι μαθηματικοί προτιμούν πάντα τη δεύτερη επιλογή (βλ. π.χ. [Wikipedia][3]). Για την Python, έκανα την ίδια επιλογή επειδή υπάρχουν κάποιες ενδιαφέρουσες εφαρμογές της πράξης modulo όπου το πρόσημο του a δεν είναι ενδιαφέρον. Σκεφτείτε να πάρετε μια χρονοσφραγίδα POSIX (δευτερόλεπτα από την αρχή του 1970) και να τη μετατρέψετε σε ώρα ημέρας. Δεδομένου ότι υπάρχουν 24*3600 = 86400 δευτερόλεπτα σε μια ημέρα, ο υπολογισμός αυτός είναι απλά t % 86400. Αλλά αν θέλαμε να εκφράσουμε χρόνους πριν από το 1970 χρησιμοποιώντας αρνητικούς αριθμούς, ο κανόνας "αποκοπή προς το μηδέν" θα έδινε ένα αποτέλεσμα χωρίς νόημα! Χρησιμοποιώντας τον κανόνα του κατώτατου ορίου, όλα βγαίνουν μια χαρά. >, Άλλες εφαρμογές που σκέφτηκα είναι οι υπολογισμοί των θέσεων των εικονοστοιχείων στα γραφικά των υπολογιστών. Είμαι σίγουρος ότι υπάρχουν και άλλες. >, Για το αρνητικό b, παρεμπιπτόντως, τα πάντα απλά αναποδογυρίζουν και το αναλλοίωτο γίνεται:
0 >= r > b.
Γιατί, λοιπόν, η Γ δεν το κάνει με αυτόν τον τρόπο; Πιθανώς το υλικό δεν το έκανε αυτό την εποχή που σχεδιάστηκε η C. Και το υλικό πιθανότατα δεν το έκανε με αυτόν τον τρόπο επειδή στο παλαιότερο υλικό, οι αρνητικοί αριθμοί αναπαρίσταντο ως "πρόσημο + μέγεθος" και όχι ως η αναπαράσταση συμπληρώματος δύο που χρησιμοποιείται σήμερα (τουλάχιστον για τους ακέραιους). Ο πρώτος μου υπολογιστής ήταν ένας κεντρικός υπολογιστής Control Data και χρησιμοποιούσε το συμπλήρωμα του ενός για τους ακέραιους αριθμούς καθώς και για τους κινητούς. Ένα μοτίβο 60 μονάδων σήμαινε αρνητικό μηδέν! >,
Ο Tim Peters, ο οποίος γνωρίζει πού είναι θαμμένοι όλοι οι σκελετοί της Python για κινητές μονάδες, εξέφρασε κάποια ανησυχία σχετικά με την επιθυμία μου να επεκτείνω αυτούς τους κανόνες σε modulo κινητής υποδιαστολής. Πιθανόν να έχει δίκιο- ο κανόνας αποκοπής προς το αρνητικό άπειρο μπορεί να προκαλέσει απώλεια ακρίβειας για το x%1.0 όταν το x είναι ένας πολύ μικρός αρνητικός αριθμός. Αλλά αυτό'δεν είναι αρκετό για μένα ώστε να σπάσει το integer modulo, και το // είναι στενά συνδεδεμένο με αυτό. >, ΥΓ. Σημειώστε ότι χρησιμοποιώ // αντί για / -- αυτό είναι η σύνταξη της Python 3 και επιτρέπεται επίσης στην Python 2 για να τονιστεί ότι γνωρίζετε ότι καλείτε ακέραια διαίρεση. Ο τελεστής / στην Python 2 είναι διφορούμενος, καθώς επιστρέφει διαφορετικό αποτέλεσμα για δύο ακέραιους τελεστές από ό,τι για έναν int και έναν float ή δύο floats. Αλλά αυτό είναι μια εντελώς ξεχωριστή ιστορία- δείτε το PEP 238. >, Αναρτήθηκε από τον Guido van Rossum στις 9:49 π.μ.
Ο τελεστής Modulus, χρησιμοποιείται για τη διαίρεση υπολοίπων σε ακέραιους αριθμούς, συνήθως, αλλά στην Python μπορεί να χρησιμοποιηθεί για αριθμούς κινητής υποδιαστολής.
http://docs.python.org/reference/expressions.html
Ο τελεστής % (modulo) δίνει το υπόλοιπο από τη διαίρεση του πρώτου ορίσματος με το δεύτερο. Τα αριθμητικά ορίσματα μετατρέπονται πρώτα σε κοινό τύπο. Ένα μηδενικό δεξιό όρισμα προκαλεί την εξαίρεση ZeroDivisionError. Τα ορίσματα μπορεί να είναι αριθμοί κινητής υποδιαστολής, π.χ., 3,14%0,7 ισούται με 0,34 (αφού 3,14 ισούται με 4*0,7 + 0,34.) Ο τελεστής modulo δίνει πάντα ένα αποτέλεσμα με το ίδιο πρόσημο με το δεύτερο τελεστέο του (ή μηδέν)- η απόλυτη τιμή του αποτελέσματος είναι αυστηρά μικρότερη από την απόλυτη τιμή του δεύτερου τελεστή [2].