Jaka jest różnica między „/” a „//” w przypadku podziału?


473

Czy jest korzyść z używania jednego nad drugim? W Pythonie 2 oba wydają te same wyniki:

>>> 6/3
2
>>> 6//3
2

1
Proszę odnieść się do problemu z// podziałem na liczby całkowite, aby poznać powód wprowadzenia operatora do dzielenia na liczby całkowite.
Sriram

Odpowiedzi:


649

W Pythonie 3.x 5 / 2powróci 2.5i 5 // 2powróci 2. Pierwszy z nich to dzielenie zmiennoprzecinkowe, a drugi to podział podłogowy , czasem nazywany także dzieleniem całkowitym .

W Pythonie 2.2 lub nowszym w wierszu 2.x nie ma różnicy dla liczb całkowitych, chyba że wykonasz a from __future__ import division, co powoduje, że Python 2.x przyjmuje zachowanie 3.x.

Niezależnie od przyszłego importu, 5.0 // 2wróci, 2.0ponieważ jest to wynik podziału podłogi operacji.

Szczegółowy opis można znaleźć na stronie https://docs.python.org/whatsnew/2.2.html#pep-238-zmienianie-the-division-operator


edytowane: Możesz „naprawić” podział od Python 2.2! (Wystarczy przeczytać połączony PEP)
u0b34a0f6ae

2
także python -Qnew. inne opcje podziału: -Qold(domyślnie), -Qwarn,-Qwarnall
John La Rooy

2
Warto zauważyć, że 5.0 / 2powraca 2.5we wszystkich wersjach, podobnie jak 5 / 2.0- stare zachowanie różni się tylko wtedy, gdy oba operandy są int.
Chris,

2
Co jeśli liczby są ujemne? Czy zachowanie jest takie samo dla ujemnych liczb całkowitych?
Aaron Franke

1
@Srinivasu Twój przykład nie jest pomocny. Lepiej byłoby 5 // 2 (co daje 2) i -5 // 2 (co daje -3).
Marvin,

67

Wyjaśnienie w języku Python 2.x:

Wyjaśnienie linii Python 2.x /nie jest ani podziałem podłogi, ani podziałem prawdziwym. Obecna akceptowana odpowiedź nie jest w tym zakresie jasna.

/jest podziałem podłogi, gdy oba argumenty są int, ale jest prawdziwym podziałem, gdy jeden lub oba argumenty są float.

Powyższe mówi więcej prawdy i jest bardziej jasne niż drugi akapit w przyjętej odpowiedzi.


33

//wdraża „podział podłogi”, niezależnie od typu. Tak 1.0/2.0da 0.5, ale obie 1/2, 1//2i 1.0//2.0dadzą 0.

Szczegółowe informacje można znaleźć na stronie https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


To dobra odpowiedź. Link PEP jest pomocny. Rozważ też użycie math.floor()lub, math.fmod()jeśli nie jesteś pewien, co się dzieje z jednostkowymi operatorami.
Scott Lowrey,

/i //są podwójnymi operatorami (dwa operandy, lewy i prawy, licznik i mianownik)
iono

28

/ -> Dzielenie zmiennoprzecinkowe

// -> Podział podłogi

Zobaczmy przykłady w Pythonie 2.7 i Pythonie 3.5.

Python 2.7.10 vs. Python 3.5

print (2/3)  ----> 0                   Python 2.7
print (2/3)  ----> 0.6666666666666666  Python 3.5

Python 2.7.10 vs. Python 3.5

  print (4/2)  ----> 2         Python 2.7
  print (4/2)  ----> 2.0       Python 3.5

Teraz, jeśli chcesz mieć (w Pythonie 2.7) takie same dane wyjściowe jak w Pythonie 3.5, możesz wykonać następujące czynności:

Python 2.7.10

from __future__ import division
print (2/3)  ----> 0.6666666666666666   #Python 2.7
print (4/2)  ----> 2.0                  #Python 2.7

Gdzie, ponieważ nie ma różnicy między podziałem podłogi w Pythonie 2.7 i Pythonie 3.5

138.93//3 ---> 46.0        #Python 2.7
138.93//3 ---> 46.0        #Python 3.5
4//3      ---> 1           #Python 2.7
4//3      ---> 1           #Python 3.5

czy to to samo co int (5/2)?
PirateApp

Co jeśli liczby są ujemne? Czy zachowanie jest takie samo dla ujemnych liczb całkowitych?
Aaron Franke

1
Re: Negatywy - Zachowanie jest takie samo, ale pamiętaj, że wynikiem jest floor, więc zaokrąglanie jest zawsze w dół w kierunku bardziej negatywnego . Kilka przykładów: -100 // 33=> -4 ; 100 // -33=> -4 ; ale ze względu na zaokrąglanie funkcji podłogi, następny może wydawać się sprzeczny z intuicją w porównaniu do poprzedniego: -100 // -33=> 3 .
Erdős-Bacon,

22

Jak wszyscy już odpowiedzieli, //jest podział podłogi.

Ważne jest to, że //jest to jednoznaczny podział podłogi we wszystkich wersjach Python od 2.2, w tym w wersjach Python 3.x.

Zachowanie /może się zmienić w zależności od:

  • Aktywny __future__ import, czy nie (moduł lokalny)
  • Opcja linii poleceń Python, albo -Q oldczy-Q new

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

1
Nie zdawałem sobie sprawy, że podział podłogi również działa z liczbami niecałkowitymi. Dzięki!
Mike

5

Python 2.7 i inna nadchodząca wersja Pythona:

  • Division ( /)

Dzieli operand lewej ręki na operand prawej ręki

Przykład: 4 / 2 = 2

  • Podział podłogi ( //)

Podział argumentów, w którym wynikiem jest iloraz, w którym cyfry po przecinku są usuwane. Ale jeśli jeden z operandów jest ujemny, wynik jest zmienny, tzn. Zaokrąglony od zera (w kierunku ujemnej nieskończoności):

Przykłady: 9//2 = 4i 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

Zarówno /dział, jak i //operator działu pięter działają w podobny sposób.


2
W kierunku nieskończoności i od zera są różne rzeczy. Przykład dla (-1.2 i 3.4): „podłoga” jest w kierunku ujemnej nieskończoności (-2 i 3), „obcinanie” jest w kierunku zera (-1 i 3), „nasycenie” jest w odległości od zera (-2 i 4), a „pułap” zmierza w kierunku dodatniej nieskończoności (-1 i 4).
Phernost


3

//jest podział podłogi, zawsze da ci całkowitą podłogę wyniku. Drugi to podział „zwykły”.


2

Odpowiedź równania jest zaokrąglana do następnej mniejszej liczby całkowitej lub liczby zmiennoprzecinkowej z 0,0 jako kropką dziesiętną.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0

2

Powyższe odpowiedzi są dobre. Chcę dodać kolejny punkt. Do niektórych wartości obie z nich dają ten sam iloraz. Po tej operacji operator podziału ( //) działa poprawnie, ale nie /operator podziału ( ).

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer

-1

5.0//2powoduje 2.0, a nie 2dlatego, że typ zwracanej wartości zwracanej z// operatora jest zgodny z regułami koercji python (rzutowanie typu).

Python promuje konwersję niższego typu danych (liczba całkowita) na wyższy typ danych (liczba zmiennoprzecinkowa), aby uniknąć utraty danych.


-1
  • // to podział podłogi, zawsze da ci wartość końcową wyniku.
  • Drugi /to podział zmiennoprzecinkowy.

Poniżej przedstawiono różnicę między /i //; Uruchomiłem te operacje arytmetyczne w Pythonie 3.7.2

>>> print (11 / 3)
3.6666666666666665

>>> print (11 // 3)
3

>>> print (11.3 / 3)
3.7666666666666667

>>> print (11.3 // 3)
3.0

2
Jak ta odpowiedź dodaje coś, czego nie obejmują inne pomysły? Lub w jaki sposób ta odpowiedź jest lepsza niż inne odpowiedzi?
Rory Daulton

2
Poniżej przedstawiono wynik działania programu. To nic nie wyjaśnia.
Markiz Lorne
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.