logo

Floor Division în Python

În următorul tutorial, vom afla despre funcționarea Floor Division folosind limbajul de programare Python.

Dar înainte de a începe, să înțelegem pe scurt ce este Floor division.

Înțelegerea diviziunii de etaj

Împărțirea etajului este o operație normală de împărțire, cu excepția faptului că returnează cel mai mare număr întreg posibil. Acest număr întreg poate fi fie mai mic decât rezultatul normal al diviziunii, fie egal cu acesta.

Funcția de podea este semnificată prin simbolul ⌊ ⌋ în termeni matematici.

Să înțelegem acum funcționarea operațiunii de diviziune a etajului. De exemplu,

⌊36/5⌋

Pasul 1: Efectuarea diviziunii mai întâi. Ne vom împărți 36 de 5 .

36 ÷ 5 = 7,2

Pasul 2: Acum, vom efectua funcția de etaj pe valoarea pe care o obținem după împărțire, adică, 7.2 .

⌊7.2⌋=7

Drept urmare, obținem 7 care este valoarea de bază a 7.2 . Prin urmare, împărțirea etajului înseamnă împărțirea și rotunjirea în jos la cel mai apropiat număr întreg.

Diferite limbaje de programare oferă o anumită funcție încorporată sau un operator pentru a calcula împărțirea podelei. Câteva exemple pot fi:

  1. Putem folosi podea() metoda în limbajul de programare C++.
  2. Putem folosi podea() metoda în limbajul de programare Java.
  3. Putem folosi // operator în limbajul de programare Python.

Cu toate acestea, vom discuta doar despre utilizarea operațiunii de divizare a podelei în Python cu ajutorul operator dublu backslash (//). .

Înțelegerea diviziunii etajului folosind Python

În limbajul de programare Python, împărțirea etajului este folosită pentru a împărți două numere și rotunjește rezultatul la cel mai apropiat număr întreg.

Înainte de a aprofunda conceptul de împărțire a podelei, să ne reamintim pe scurt sensul divizării și modul de funcționare a math.floor() funcție în Python.

Efectuarea diviziunii regulate în Python

Putem împărți două numere folosind bara oblică inversă ( / ) operator de diviziune în Python. Să luăm în considerare următorul exemplu care demonstrează același lucru:

Exemplul 1:

 # declaring variables a = 13 b = 4 # performing regular division c = a / b # printing the result print(a, '/', b, '=', c) 

Ieșire:

 13 / 4 = 3.25 

Explicaţie:

În fragmentul de cod de mai sus, am definit două variabile ca a = 13 și b = 4 . Am efectuat apoi o operație de împărțire folosind bara oblică inversă ( / ) operator de divizare și a stocat valoarea rezultată într-o nouă variabilă, c . În cele din urmă, am tipărit valoarea lui c .

După cum putem vedea, diviziunea în Python funcționează la fel ca diviziunea în matematică.

Înțelegerea funcției math.floor() în Python

Există un modul de matematică încorporat în Python care constă din diferite utilități matematice utile pentru calcule.

O astfel de funcție încorporată a matematica modulul este math.floor() funcţie. Această funcție acceptă o intrare numerică și returnează valoarea minimă rotunjind-o în jos la cel mai apropiat număr întreg.

Să luăm în considerare următorul exemplu care demonstrează același lucru:

Exemplul 2:

 # importing the floor() function from the math module from math import floor # declaring the variables a = 5.34 b = -5.34 # using the floor() function c = floor(a) d = floor(b) # printing the values print('Floor value of', a, '=', c) print('Floor value of', b, '=', d) 

Ieșire:

 Floor value of 5.34 = 5 Floor value of -5.34 = 6 

Explicaţie:

În fragmentul de cod de mai sus, am importat podea() funcția de la matematica modul. Apoi am declarat două variabile ca a = 5,34 și b = -5,34 . Am folosit apoi podea() funcție pentru a calcula valorile de bază ale ambelor variabile și le-a stocat în variabile noi, c și d . În cele din urmă, am tipărit rezultatele pentru utilizatori.

Acum că am înțeles conceptele de împărțire și împărțire a numerelor în Python. Să ne îndreptăm spre detaliile asociate cu diviziunea podelei în Python.

Efectuarea Floor Division în Python

Împărțirea etajului este o operație în Python care ne permite să împărțim două numere și să rotunjim valoarea rezultată la cel mai apropiat număr întreg. Împărțirea podelei are loc prin operator dublu backslash (//). . Sintaxa pentru același lucru este prezentată mai jos:

Sintaxă:

 res = var_1 // var_2 

Unde:

    reseste valoarea rezultantă a diviziunii podeleia fost_1este dividendula fost_2este divizorul

Ne putem gândi la diviziunea podelei ca la diviziunea obișnuită combinată cu math.floor() apel de funcție.

Notă: Diviziunea podelei poate rotunji orice număr în jos la cel mai apropiat număr întreg. De exemplu, 3,99 va fi în continuare rotunjit la 3.

Să luăm acum în considerare un exemplu care demonstrează funcționarea divizării podelei.

Exemplul 3:

 # declaring the variables a = 13 b = 5 # using the // operator c = a // b # comparing the floor value with regular division d = a / b # printing the values print('Floor Division:', a, '//', b, '=', c) print('Regular Division:', a, '/', b, '=', d) 

Ieșire:

 Floor Division: 13 // 5 = 2 Regular Division: 13 / 5 = 2.6 

Explicaţie:

În fragmentul de cod de mai sus, am declarat două variabile ca a = 13 și b = 5 . Am folosit apoi // operator pentru a calcula valoarea diviziunii etajului și a stocat valoarea etajului într-o nouă variabilă, c . Am efectuat apoi împărțirea obișnuită folosind / operator și a stocat valoarea într-o altă variabilă, d . În cele din urmă, am tipărit ambele rezultate și le-am comparat.

Acum, să luăm în considerare un alt exemplu folosind math.floor() funcţie.

Exemplul 4:

 # importing the floor() function from the math module from math import floor # declaring the variables a = 17 b = 5 # using the floor() function c = floor(a / b) # comparing the floor() function with // operator d = a // b # printing the values print('Floor Division using floor() function:', c) print('Floor Division using // operator:', d) 

Ieșire:

 Floor Division using floor() function: 3 Floor Division using // operator: 3 

Explicaţie:

Am importat podea() funcția de la matematica modul în fragmentul de cod de mai sus. Apoi am declarat două variabile ca a = 17 și b = 5 . Am folosit apoi podea() funcție, împărțită A de b , și l-a stocat în variabila c. Apoi am calculat valoarea podelei folosind // operator și a stocat valoarea într-o nouă variabilă, d . În cele din urmă, am tipărit ambele valori și le-am comparat.

Efectuarea împărțirii etajului cu numere negative

De asemenea, putem efectua împărțirea etajului folosind numere negative.

În cazul numerelor negative, valoarea rezultată este încă rotunjită în jos la cel mai apropiat număr întreg. Unii s-ar putea confunda prin rotunjirea în jos a unui număr negativ implică trecerea de la zero. De exemplu, -23 este pardosită până la -3 .

Să luăm în considerare un exemplu care demonstrează împărțirea etajului cu numere negative.

Exemplul 5:

 # declaring the variables a = -10 b = 4 # calculating floor value using // operator c = a // b # printing the value print('Floor Division:', a, '//', b, '=', c) 

Ieșire:

 Floor Division: -10 // 4 = -3 

Explicaţie:

În fragmentul de cod de mai sus, am declarat două variabile ca a = -10 și b = 4 . Am folosit apoi // operator pentru a calcula valoarea etajului și a stocat-o într-o nouă variabilă, c . În cele din urmă, am tipărit valoarea pentru utilizator.

Cu o diviziune regulată, -10/4 s-ar întoarce -2,5 ; cu toate acestea, cu o diviziune de etaj, acest număr este rotunjit în jos la cel mai apropiat număr întreg negativ, adică la -3 .

Efectuarea diviziei de podea cu plutitoare

De asemenea, putem efectua împărțirea etajului cu float în Python. Atunci când se împarte flotanți, rezultatul este un float care reprezintă cel mai apropiat număr întreg.

Să luăm în considerare următorul exemplu care demonstrează împărțirea podelei folosind flotoare.

Exemplul 6:

 # initializing the lists a = [17.5, 10, 13.4] b = [3.3, 2.5, 3] # using for-loop to iterate through the list for i in range(0, 3): # calculating the floor division value c = a[i] // b[i] # printing the result print(a[i], '//', b[i], '=', c) 

Ieșire:

 17.5 // 3.3 = 5.0 10 // 2.5 = 4.0 13.4 // 3 = 4.0 

Explicaţie:

În fragmentul de cod de mai sus, am inițializat două liste. Am folosit apoi pentru -bucla pentru a itera elementele acestor liste, a calculat valorile pentru fiecare operațiune de împărțire a etajului și a tipărit rezultatele pentru utilizatori.

Ca rezultat, putem observa că operația de împărțire a etajului se realizează folosind float și float cu întreg returnează valoarea rotunjită în jos la cel mai apropiat număr întreg reprezentat ca float.

Floor Division și Modulo în Python

În matematică, modulo este un concept asociat în principal cu împărțirea etajelor. De asemenea, putem spune că modulo înseamnă restul din împărțirea între două numere. Cu alte cuvinte, putem număra numărul de resturi cu el.

Putem calcula modulo în Python folosind procentul ( % ) operator.

Să luăm în considerare un exemplu care ilustrează relația dintre diviziunea etajului și modulo în Python.

Exemplul 7.1:

Având în vedere 13 bomboane și 4 mâncători, putem calcula numărul de bomboane pe care le primește fiecare mâncător cu ajutorul diviziunii de podea.

redenumirea directorului în linux

Cod:

 # declaring variables numberOfCandies = 13 numberOfEaters = 4 # using floor division to calculate the number of candies each eater gets candiesPerEater = numberOfCandies // numberOfEaters # printing values print('Number of Candies:', numberOfCandies) print('Number of Eaters:', numberOfEaters) print('The number of candies each eater gets:', candiesPerEater) 

Ieșire:

 Number of Candies: 13 Number of Eaters: 4 The number of candies each eater gets: 3 

Explicaţie:

În fragmentul de cod de mai sus, am declarat câteva variabile care semnifică numărul de bomboane și mâncători. Am folosit apoi // operatorul să efectueze împărțirea podelei pentru a calcula numărul de bomboane pe care le primește fiecare consumator. Am imprimat apoi aceste valori pentru utilizator.

Să calculăm acum numărul total de bomboane împărțite între grup. Acest lucru nu este foarte important.

Exemplul 7.2:

Vom înmulți numărul de bomboane de persoană cu numărul de mâncători.

Cod:

 # calculating the total number of candies being shared among the group totalCandiesShared = candiesPerEater * numberOfEaters # printing values print('The total number of candies being shared among the group:', totalCandiesShared) 

Ieșire:

 The total number of candies being shared among the group: 12 

Explicaţie:

În fragmentul de cod de mai sus, am calculat numărul total de bomboane împărțite între grup prin înmulțirea numărului de bomboane per persoană cu numărul de mâncători și am tipărit valoarea rezultată pentru utilizatori.

Numărul total de bomboane pline partajate este 12 . Cu toate acestea, numărul total de bomboane este 13 . Această afirmație implică că o bomboană va rămâne și nu va fi mâncată.

Exemplul de mai sus descrie o modalitate de a calcula numărul de resturi. Totuși, dacă ne interesează doar numărul de resturi, îl putem calcula direct cu ajutorul modulo.

Exemplul 7.3:

Având în vedere 13 bomboane și 4 mâncători, care este numărul de bomboane rămase?

Cod:

 # declaring variables numberOfCandies = 13 numberOfEaters = 4 # using modulo to calculate the leftover candies leftoverCandies = numberOfCandies % numberOfEaters # printing values print('Number of Candies:', numberOfCandies) print('Number of Eaters:', numberOfEaters) print('Total number of Leftover Candies:', leftoverCandies) 

Ieșire:

 Number of Candies: 13 Number of Eaters: 4 Total number of Leftover Candies: 1 

Explicaţie:

În fragmentul de cod de mai sus, am declarat variabilele care stochează valoarea bomboanelor și consumatorilor. Apoi am calculat numărul de bomboane rămase folosind % operator care semnifică operaţia modulo. În cele din urmă, am tipărit câteva declarații și valorile rezultate pentru utilizatori. Drept urmare, putem vedea că bomboanele rămase sunt 1 .

a = b * (a // b) + (a % b)

În Python, diviziunea podelei și modulo sunt legate prin următoarea ecuație:

Unde:

    Aeste dividendul.beste divizorul.

De exemplu, să verificăm că ecuația de mai sus este valabilă pentru cele 13 bomboane și 4 mâncători.

13 = 4 * (13 // 4) + (13% 4)
13 = 4 * 3 + 1
13 = 13

Astfel, am înțeles conceptele de împărțire a podelei și modulo în Python. Acum, ne vom uita la o funcție încorporată care le calculează pe ambele.

Înțelegerea funcției divmod() în Python

Python oferă o funcție încorporată numită divmod() care ne permite să calculăm atât diviziunea etajului, cât și modulo între două valori numerice.

Sintaxa pentru divmod() funcția este prezentată mai jos:

Sintaxă:

 res = divmod(var_1, var_2) 

Unde:

    reseste rezultatul ca tuplu. Acest tuplu are rezultatul diviziunii etajului și restul dat de modulo.a fost_1este dividendul.a fost_2este divizorul.

Să luăm acum în considerare următorul exemplu care demonstrează divmod() funcţie.

Exemplul 8:

Având în vedere 13 bomboane și 4 mâncători, câte bomboane pline primește fiecare mâncător și câte bomboane au rămas?

Cod:

 # declaring variables numberOfCandies = 13 numberOfEaters = 4 # using the divmod() function nCandies, nLeftovers = divmod(numberOfCandies, numberOfEaters) # printing values print('Number of Candies:', numberOfCandies) print('Number of Eaters:', numberOfEaters) print('Number of Candies per eater:', nCandies) print('Total number of Leftover Candies:', nLeftovers) 

Ieșire:

 Number of Candies: 13 Number of Eaters: 4 Number of Candies per eater: 3 Total number of Leftover Candies: 1 

Explicaţie:

În fragmentul de cod de mai sus, am declarat câteva variabile. Am folosit divmod() funcția pentru a calcula valoarea diviziunii etajului și modulo pentru variabilele date. Am imprimat apoi aceste valori pentru utilizatori.

Înțelegerea priorității diviziei de etaj

În Python, operatorul de diviziune de etaj // are un nivel de prioritate similar cu înmulțirea ( * ), Divizia ( / ), și modulo ( % ).

Această afirmație implică faptul că, dacă înmulțim și apoi împărțim etaj, se realizează mai întâi înmulțirea, apoi împărțirea etajului și invers.

Cu toate acestea, dacă, de exemplu, scădem două numere și apoi efectuăm împărțirea etajului, operația de împărțire a etajului va deschide calea.

Să luăm în considerare un exemplu care demonstrează același lucru.

Exemplul 9.1:

 # declaring some variables a = 3 b = 5 c = 6 d = 7 # performing an operation e = a * b // c - d # printing the result print(a, '*', b, '//', c, '-', d, '=', e) 

Ieșire:

 3 * 5 // 6 - 7 = -5 

Explicaţie:

În fragmentul de cod de mai sus, am declarat unele variabile ca a = 3, b = 5, c = 6 , și d = 7 . Apoi am efectuat o operație și am stocat valoarea rezultată într-o nouă variabilă, Este . În cele din urmă, am imprimat această valoare pentru utilizatori.

Pentru a înțelege cum este calculat acest rezultat, putem introduce paranteze în jurul termenilor în ordinea corectă de precedență.

Exemplul de mai jos ilustrează același lucru:

Exemplul 9.2:

 # declaring some variables a = 3 b = 5 c = 6 d = 7 # performing an operation e = ((a * b) // c) - d # printing the result print('((', a, '*', b, ') //', c, ') -', d, '=', e) 

Ieșire:

 (( 3 * 5 ) // 6 ) - 7 = -5 

Explicaţie:

În fragmentul de cod de mai sus, am declarat unele variabile ca a = 3, b = 5, c = 6 , și d = 7 . Apoi am efectuat aceeași operație, dar cu paranteze și am stocat valoarea rezultată într-o nouă variabilă, Este . În cele din urmă, am imprimat această valoare pentru utilizatori.

După cum putem observa că obținem rezultatul similar ca din exemplul anterior, ceea ce înseamnă că ordinea calculului este:

Înmulțire → Împărțire etaj → Scădere

Iată calculul treptat al celor de mai sus:

3 * 5 // 6 - 7
((3 * 5) // 6) - 7
(15 // 6) - 7
2 - 7
-5

Am înțeles corect împărțirea etajului și utilizarea ei în limbajul de programare Python.

În cele din urmă, ne vom uita la un caz de utilizare avansat pentru diviziunea podelei. În cazul următor, avansat nu înseamnă greu; cu toate acestea, este destul de neobișnuit.

Înțelegerea utilizării în avans a diviziunii podelei

Unii dintre noi ar putea fi conștienți de faptul că putem crea și obiecte personalizate care să susțină operațiunea de împărțire a podelei în Python. Acest lucru poate fi posibil printr-o metodă specială cunoscută ca __floordiv__() .

Metoda __floordiv__() în Python

Operația de împărțire a podelei în Python este folosită pentru a împărți două numere și rotunjește rezultatul la cel mai apropiat număr întreg.

Funcționează sub capotă deoarece un tip numeric implementează o metodă specială numită __floordiv__() . Apoi, ori de câte ori sunăm la // operator între două obiecte, the __floordiv__() metoda este apelată.

indicator în c

În Python, putem, de asemenea, apela direct __floordiv__() metodă. Să luăm în considerare următorul exemplu care demonstrează același lucru:

Exemplul 10:

 # declaring some variables a = 31 b = 7 # performing floor division using the // operator c = a // b # performing floor division using the __floordiv__() method d = (a).__floordiv__(b) # printing the results of both operations print('Using the // operator:
', a, '//', b, '=', c) print('Using the __floordiv__() method:
 (', a, ').__floordiv__(', b, ') =', c) 

Ieșire:

 Using the // operator: 31 // 7 = 4 Using the __floordiv__() method: ( 31 ).__floordiv__( 7 ) = 4 

Explicaţie:

În fragmentul de cod de mai sus, am declarat două variabile ca a = 31 și b = 7 . Apoi am efectuat împărțirea podelei folosind // operator și __floordiv__() metoda și a stocat valorile lor rezultate în două variabile, c și d . În cele din urmă, am tipărit rezultatele pentru utilizatori.

Din rezultatul prezentat mai sus, putem observa că ambele expresii au dat același rezultat. Acest lucru se datorează faptului că prima expresie este convertită în a doua expresie. Cu alte cuvinte, aceste apeluri sunt echivalente între ele.

Acum, lucrurile vor deveni interesante. Să luăm în considerare următorul exemplu.

Exemplul 11.1:

Vom crea o clasă personalizată reprezentând valorile întregi ca șiruri în exemplul următor. Vom crea apoi două obiecte din această clasă personalizată și vom efectua operațiuni de împărțire a podelei pe ele.

Cod:

 # creating a class representing integer values as string class IntStr: def __init__(self, val): self.val = val # instantiating the class with two objects intOne = IntStr('17') intTwo = IntStr('4') # printing the result of the floor division operation print(intOne // intTwo) 

Ieșire:

 Traceback (most recent call last): File 'D:Python_programspycase.py', line 11, in print(intOne // intTwo) TypeError: unsupported operand type(s) for //: 'IntStr' and 'IntStr' 

Explicaţie:

În fragmentul de cod de mai sus, am definit o clasă ca IntStr care reprezintă valorile întregi ca șiruri de caractere. Am creat apoi două obiecte ale IntStr clasă. În cele din urmă, avem împărțirea podelei intOne obiect de către intDoi obiect și a încercat să imprimați rezultatul.

Cu toate acestea, rezultatul de mai sus indică a Eroare de scris . Acest mesaj de eroare dezvăluie că IntStr obiectele nu suportă împărțirea podelei. Această eroare are sens. Cum ar avea tipul personalizat vreo idee despre obiectele șiruri de împărțire a podelei?

Cu toate acestea, după cum se dovedește, putem face IntStr diviziunea podelei suport obiect.

Anterior, am învățat ori de câte ori sunam la // operator, numim __floordiv__() metodă. Această metodă este executată undeva în clasa obiectului. De exemplu, obiectele int acceptă divizarea etajului deoarece clasa int a aplicat __floordiv__() metodă.

Aceste metode speciale, cum ar fi __floordiv__() , au ceva uimitor în comun că putem implementa aceste metode în clasa personalizată. Cu alte cuvinte, putem face ca obiectele personalizate să accepte divizarea etajului în limbajul de programare Python.

Să luăm acum în considerare următorul exemplu care demonstrează același lucru.

Exemplul 11.2:

În exemplul următor, vom implementa __floordiv__() metoda în IntStr clasă. Vom crea apoi două obiecte din această clasă personalizată și vom efectua operațiuni de împărțire a podelei pe ele.

Cod:

 # creating a class representing integer values as string class IntStr: def __init__(self, val): self.val = val def __floordiv__(self, other): intOne = int(self.val) intTwo = int(other.val) res = intOne // intTwo return IntStr(str(res)) # instantiating the class with two objects intOne = IntStr('17') intTwo = IntStr('4') # performing floor division operation res = intOne // intTwo # printing the result of the floor division operation print(intOne.val, '//', intTwo.val, '=', res.val) 

Ieșire:

 17 // 4 = 4 

Explicaţie:

În fragmentul de cod de mai sus, am definit o clasă ca IntStr care reprezintă valorile întregi ca șiruri de caractere. De asemenea, am implementat __floordiv__() metoda din cadrul acestei clase. Această metodă acceptă valoarea șirului numeric de la sine și de la un alt obiect. Am convertit aceste valori de șir în numere întregi și am efectuat o împărțire a etajului între ele. Apoi am convertit rezultatul înapoi într-un șir și am creat un nou IntStr obiect. Am instanțiat IntStr clasa cu două obiecte și a efectuat o operație de împărțire a podelei între ele. În cele din urmă, am tipărit valoarea rezultată pentru utilizatori.

Acum că înțelegem cu succes metoda de a face o clasă personalizată pentru a sprijini împărțirea podelei.

Dacă nu ne place faptul că trebuie să sunăm obiect.val pentru a vedea rezultatul, putem implementa __str__() metodă care returnează direct valoarea în timpul imprimării.

Să luăm în considerare următorul exemplu care demonstrează același lucru.

Exemplul 11.3:

 # creating a class representing integer values as string class IntStr: def __init__(self, val): self.val = val def __floordiv__(self, other): intOne = int(self.val) intTwo = int(other.val) res = intOne // intTwo return IntStr(str(res)) def __str__(self): return self.val # instantiating the class with two objects intOne = IntStr('17') intTwo = IntStr('4') # performing floor division operation res = intOne // intTwo # printing the result of the floor division operation print(intOne, '//', intTwo, '=', res) 

Ieșire:

 17 // 4 = 4 

Explicaţie:

În fragmentul de cod de mai sus, am definit o clasă ca IntStr care reprezintă valorile întregi ca șiruri de caractere. De asemenea, am implementat __floordiv__() metoda din cadrul acestei clase. Am definit apoi __str__() metodă care returnează direct valorile șirului în timpul imprimării. Am instanțiat IntStr clasa cu două obiecte și a efectuat o operație de împărțire a podelei între ele. În cele din urmă, am tipărit valoarea rezultată pentru utilizatori.