Cum se efectuează diviziunea etajului în Python

Publicat: 2022-11-02

În acest tutorial, veți învăța cum să efectuați împărțirea podelei în Python. Veți folosi operatorul // al lui Python, funcția de sol din modulul de matematică al lui Python și multe altele - cu exemple de cod.

Vom începe cu o prezentare generală a operatorilor aritmetici din Python și vom afla cum funcționează operatorul de diviziune de etaj //. Apoi, vom învăța cum să folosim alte metode echivalente, inclusiv funcții din modulele de matematică și operator pentru a efectua împărțirea etajului.

Să începem…

Operatori aritmetici în Python

În Python, puteți folosi operatori aritmetici pentru a efectua operații aritmetice simple pe numere de tipul de date int și float . Acești operatori acționează asupra operanzilor (numerele) și returnează rezultatul operației.

Operatori-aritmetici-în-Python

Următorul tabel rezumă operatorii aritmetici din Python și modul în care funcționează:

Operator Sintaxă Rezultat
Adăugare (+) num1+num2 Returnează suma num1 și num2
Scădere (-) num1-num2 Returnează diferența dintre num1 și num2
Înmulțire (*) num1*num2 Returnează produsul dintre num1 și num2
Exponentiație (**) num1**num2 Returnează rezultatul lui num1 ridicat la puterea lui num2 ; num1 num2
Divizia (/) num1/num2 Returnează rezultatul când num1 este împărțit la num2 - inclusiv partea fracțională
Împărțire etaj (/) num1//num2 Returnează coeficientul când num1 este împărțit la num2
Modul (%) num1 % num2 Returnează restul când num1 este împărțit la num2

Să luăm câteva exemple care folosesc acești operatori aritmetici. Puteți încerca aceste exemple într-un REPL Python sau în editorul online Python al Geekflare.

 >>> num1 = 18 >>> num2 = 5 >>> num1 + num2 23 >>> num1 - num2 13 >>> num1 * num2 90 >>> num1 ** num2 1889568

În acest exemplu, num1 este 18 și num2 este 5. Operația de împărțire num1/num2 returnează rezultatul, inclusiv partea fracțională.

Numărul 5 intră în 18 de trei ori, lăsând un rest de trei. Prin urmare, operația de împărțire a etajului, num1//num2 , dă coeficientul 3, în timp ce operatorul modulo dă restul – tot 3 în acest caz.

 >>> num1/num2 3.6 >>> num1//num2 3 >>> num1 % num2 3

Acest lucru ar trebui să vă ofere o idee despre modul în care funcționează diviziunea, diviziunea de etaj și operatorii modulo. În continuare, vom afla în detaliu despre operatorul diviziunii de etaj.

️ În Python 2, operația de împărțire (/) trunchiază rezultatul la cel mai apropiat număr întreg — similar cu operația de împărțire a etajului din Python 3. Acest tutorial discută cum funcționează operația de împărțire a etajului în Python 3.x.

Diviziune de etaj Utilizând operatorul //

Etaj-Diviziune-Utilizarea-operatorului

Luați în considerare o operațiune de divizare cu un dividend și un divizor. În num1/num2 , num1 este dividendul și num2 este divizorul. Pentru a efectua împărțirea etajului a num1 și num2 , utilizați num1//num2 .

Operatorul de împărțire a etajului (//) returnează câtul operației de împărțire — ca un număr întreg sau un număr în virgulă mobilă — în funcție de tipurile de date ale operanzilor.

Operatorul de împărțire a etajului nu se asigură că răspunsul este întotdeauna un număr întreg. Dacă dividendul ( num1 ) sau divizorul ( num2 ) este un float, atunci rezultatul lui num1//num2 este un float. Iată câteva exemple.

 >>> 18.0//5 3.0 >>> 10.0//4 2.0 >>> 15//4.0 3.0

Dacă aveți nevoie ca rezultatul să fie un număr întreg, atunci trebuie să îl transformați în mod explicit într-un număr întreg folosind funcția int() :

 >>> int(18.0//5) 3 >>> int(10.0//4) 2 >>> int(15//4.0) 3

Ce se întâmplă sub capotă?

Când utilizați operatorul de împărțire a etajului //, este apelată metoda specială (numită și metoda dunder) __floordiv__() . Prin urmare, puteți utiliza și metoda __floordiv__() pe orice număr întreg sau cu virgulă mobilă, după cum se arată mai jos:

 num1 = 18 num2 = 5 num1.__floordiv__(num2) # Output: 3

Diviziune de etaj Folosind operator.floordiv()

Floor-Division-Utilizarea-operator.floordiv

Pentru a efectua împărțirea etajului în Python, puteți utiliza și funcția floordiv() din modulul operator .

Modulul operator Python conține definițiile funcțiilor eficiente care pot efectua toate operațiile aritmetice. Prin urmare, pentru a efectua împărțirea etajului, puteți utiliza și funcția floordiv() din modulul operator – în loc de operatorul //.

Utilizarea funcției floordiv() din modulul operator este echivalentă cu utilizarea operatorului de împărțire a solului.

 >>> import operator >>> operator.floordiv(18,5) # Output: 3 >>> operator.floordiv(12,5.0) # Output: 2.0

Divizarea etajului folosind math.floor()

Cum funcționează funcția de podea?

În matematică, funcția floor() ia orice număr real x ca intrare și returnează un număr întreg (rezultat). Acest rezultat este cel mai mare număr întreg care este mai mic sau egal cu numărul real x.

Pentru a înțelege mai bine acest lucru, să luăm câteva exemple și să vizualizăm aceste numere pe o linie numerică.

Exemplul 1 : Luați în considerare numărul 2.3. Cel mai mare număr întreg care este mai mic sau egal cu 2,3 ​​este 2; deci floor(2.3) va returna 2.

python-floordivision-tutorial-ex1

Exemplul 2: Puteți aplica aceeași definiție și atunci când lucrați cu numere negative. Luați în considerare numărul -1,7. Cel mai mare număr întreg care este mai mic sau egal cu -1,7 este -2; deci floor(-1,7) va returna -2.

python-floordivision-tutorial-ex2

Să verificăm rezultatele de mai sus folosind funcția floor() din modulul de matematică.

 >>> from math import floor >>> floor(2.3) 2 >>> floor(-1.7) -2

Pentru a efectua împărțirea etajului, puteți apela funcția floor() cu num1/num2 ca argument. Pe măsură ce trunchiază sau rotunjește în jos rezultatul la cel mai apropiat număr întreg, este echivalent cu operația de împărțire a etajului.

Puteți importa în mod explicit funcția floor() din modulul de math , după cum se arată:

 from math import floor num1 = 18 num2 = 5 floor(num1/num2) # Output: 3

Alternativ, puteți importa doar modulul math și apoi accesați funcția floor() folosind math.floor() .

 import math num1 = 18 num2 = 5 math.floor(num1/num2) # Output: 3

Spre deosebire de funcția floordiv() din modulul operator și operatorul de diviziune de etaj //, utilizarea math.floor(num1/num2) asigură că rezultatul este un întreg. Această metodă face codul lizibil și elimină etapa de turnare a tipului.

 import math num1 = 18.0 num2 = 5 math.floor(num1/num2) # Output: 3

Exemple de diviziune a podelei în Python

Exemple-de-Diviziune-Etaj-în-Python

Să încheiem discuția noastră cu un exemplu practic: Căutare binară.

Căutarea binară este un algoritm de căutare eficient care vă permite să căutați un element țintă prin matrice sortate în timp O(log n) , unde n este dimensiunea matricei.

Acest algoritm funcționează prin împărțirea intervalului de căutare la jumătate la fiecare pas. Acest lucru se face în funcție de faptul dacă punctul de mijloc al intervalului se potrivește cu ținta (căutarea se termină pe măsură ce se găsește potrivirea!) sau este mai mic sau mai mare decât țintă. Deoarece dimensiunea matricei este redusă la jumătate la fiecare pas, punctul de mijloc nu este întotdeauna evaluat la un număr întreg.

 itemlist = [5,7,18,21,34,45] item = 7

Luați în considerare următoarea implementare a algoritmului de căutare binar. Funcția binary_search() preia un număr ( item ) și o listă ( itemlist ) și caută apariția item în itemlist .

  • Dacă item este găsit, funcția returnează indexul la care apare item .
  • În caz contrar, returnează None .
 def binary_search(item, itemlist): # get the list size listsize = len(itemlist) - 1 # start at the two ends of the list lowerIdx = 0 upperIdx = listsize while lowerIdx <= upperIdx: # calculate the middle point # use normal division instead of floor division midPt = (lowerIdx + upperIdx)/ 2 # if item is found, return the index if itemlist[midPt] == item: return midPt # otherwise get the next midpoint if item > itemlist[midPt]: lowerIdx = midPt + 1 else: upperIdx = midPt - 1 if lowerIdx > upperIdx: return None

Această implementare este corectă din punct de vedere funcțional, cu excepția faptului că nu am luat în considerare faptul că midPt nu se evaluează la un număr întreg pe măsură ce căutarea continuă.

 binary_search(item,itemlist)

Dacă apelăm funcția, întâlnim o TypeError care afirmă că indicii listei trebuie să fie numere întregi sau felii, nu float.

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-3-a5f12ebc3145> in <module> ----> 1 binary_search(item,itemlist) <ipython-input-2-524ef6900b1f> in binary_search(item, itemlist) 12 13 # if item is found, return the index ---> 14 if itemlist[midPt] == item: 15 return midPt 16 # otherwise get the next midpoint TypeError: list indices must be integers or slices, not float

Modificăm definiția funcției pentru a folosi operatorul de împărțire a etajului:

 def binary_search(item, itemlist): # get the list size listsize = len(itemlist) - 1 # start at the two ends of the list lowerIdx = 0 upperIdx = listsize while lowerIdx <= upperIdx: # calculate the middle point # use floor division midPt = (lowerIdx + upperIdx)// 2 # if item is found, return the index if itemlist[midPt] == item: return midPt # otherwise get the next midpoint if item > itemlist[midPt]: lowerIdx = midPt + 1 else: upperIdx = midPt - 1 if lowerIdx > upperIdx: return None

Funcția returnează indexul la care se găsește elementul 7, care este indicele unu.

 binary_search(item,itemlist) # Output: 1

Concluzie

Sper că acest tutorial v-a ajutat să înțelegeți cum să efectuați împărțirea podelei în Python. Iată un rezumat al diferitelor metode pe care le-ați învățat:

  • În Python, un operator b realizează operația definită de operator cu a și b ca operanzi și returnează rezultatul operației.
  • Puteți folosi operatorul Python de împărțire a podelei //; a//b returnează câtul operației de împărțire a/b.
  • Alternativ, puteți utiliza funcția echivalentă floordiv() definită în modulul operator Python cu sintaxa: operator.floordiv(a,b) pentru a obține rezultatul a//b.
  • Toate metodele de mai sus returnează coeficientul, dar tipul de date poate fi un float sau un int, în funcție de valorile lui a și b. Deci, va trebui să turnați valoarea returnată la un număr întreg.
  • Funcția floor() din modulul matematic al lui Python poate fi folosită și pentru a efectua împărțirea etajului: math.floor(a,b) este echivalent cu a//b și returnează un număr întreg. Când doriți ca rezultatul să fie un întreg, luați în considerare utilizarea funcției floor din modulul de matematică.

Apoi, aflați cum să lucrați cu defaultdict în Python.