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.
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)
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)
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):
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).
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 ( ).
//
podziałem na liczby całkowite, aby poznać powód wprowadzenia operatora do dzielenia na liczby całkowite.Odpowiedzi:
W Pythonie 3.x
5 / 2
powróci2.5
i5 // 2
powróci2
. 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 // 2
wróci,2.0
ponieważ 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
źródło
python -Qnew
. inne opcje podziału:-Qold
(domyślnie),-Qwarn
,-Qwarnall
5.0 / 2
powraca2.5
we wszystkich wersjach, podobnie jak5 / 2.0
- stare zachowanie różni się tylko wtedy, gdy oba operandy sąint
.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.
źródło
//
wdraża „podział podłogi”, niezależnie od typu. Tak1.0/2.0
da0.5
, ale obie1/2
,1//2
i1.0//2.0
dadzą0
.Szczegółowe informacje można znaleźć na stronie https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator
źródło
math.floor()
lub,math.fmod()
jeśli nie jesteś pewien, co się dzieje z jednostkowymi operatorami./
i//
są podwójnymi operatorami (dwa operandy, lewy i prawy, licznik i mianownik)/ -> Dzielenie zmiennoprzecinkowe
// -> Podział podłogi
Zobaczmy przykłady w Pythonie 2.7 i Pythonie 3.5.
Python 2.7.10 vs. Python 3.5
Python 2.7.10 vs. 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
Gdzie, ponieważ nie ma różnicy między podziałem podłogi w Pythonie 2.7 i Pythonie 3.5
źródło
-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 .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:__future__
import, czy nie (moduł lokalny)-Q old
czy-Q new
źródło
źródło
Python 2.7 i inna nadchodząca wersja Pythona:
/
)Dzieli operand lewej ręki na operand prawej ręki
Przykład:
4 / 2 = 2
//
)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 = 4
i9.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.źródło
Podwójny ukośnik
//
, to podział podłogi:źródło
//
jest podział podłogi, zawsze da ci całkowitą podłogę wyniku. Drugi to podział „zwykły”.źródło
Odpowiedź równania jest zaokrąglana do następnej mniejszej liczby całkowitej lub liczby zmiennoprzecinkowej z 0,0 jako kropką dziesiętną.
źródło
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 ( ).źródło
5.0//2
powoduje2.0
, a nie2
dlatego, ż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.
źródło
//
to podział podłogi, zawsze da ci wartość końcową wyniku./
to podział zmiennoprzecinkowy.Poniżej przedstawiono różnicę między
/
i//
; Uruchomiłem te operacje arytmetyczne w Pythonie 3.7.2źródło