Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0
Czy to jest zamierzone? Mocno pamiętam powracające wcześniejsze wersje int/int=int
? Co powinienem zrobić, czy jest nowy operator działu, czy zawsze muszę go obsadzać?
python
integer
python-3.x
division
Jonas Byström
źródło
źródło
Odpowiedzi:
Spójrz na PEP-238 : Zmiana operatora dywizji
źródło
/
jest wystarczającą „błędą” projektu językowego, którą należało naprawić w Pythonie 3. Być może była to kontrowersyjna decyzja, ale wystarczająco wielu ludzi uważało, że była to poprawna decyzja. Policz mnie w grupie, która uwielbia zmianę. Fajnie, wszyscy możemy się zgodzić, że się nie zgodzimy. Twoje zdrowie. :)Ups, natychmiast znaleziono
2//2
.źródło
Mam nadzieję, że może to komuś pomóc natychmiast.
Zachowanie operatora podziału w Python 2.7 i Python 3
aby uzyskać wynik podwójnej wielokrotności 1.0 do „dywidendy lub dzielnika”
źródło
W przyjętej odpowiedzi wspomniano już o PEP 238 . Chcę tylko rzucić okiem na kulisy tych, którzy są zainteresowani tym, co się dzieje, bez czytania całego PEP.
Python mapy operatorów jak
+
,-
,*
i/
do specjalnych funkcji, tak, że na przykłada + b
jest równoważnyJeśli chodzi o podział Pythona 2 jest jedynie domyślnie
/
które odwzorowuje się__div__
, a wynik zależy od rodzaju surowców (npint
,float
).Python 2.2 wprowadził tę
__future__
funkcjędivision
, która zmieniła semantykę podziału w następujący sposób (TL; DR PEP 238):/
mapy, do__truediv__
których musi „zwrócić rozsądne przybliżenie matematycznego wyniku podziału” (cytat z PEP 238)//
odwzorowuje na__floordiv__
, co powinno zwrócić wynik zmienny z/
W Pythonie 3.0 zmiany PEP 238 stały się zachowaniem domyślnym i nie ma już specjalnej metody
__div__
w modelu obiektowym Pythona.Jeśli chcesz użyć tego samego kodu w Python 2 i Python 3 użyj
i trzymaj się semantyki PEP 238
/
i//
.źródło
Zgodnie z dokumentacją Python3, python po podzieleniu przez liczbę całkowitą wygeneruje liczbę zmiennoprzecinkową, mimo że oczekuje się, że będzie liczbą całkowitą.
Do drukowania wyłącznie liczb całkowitych użyj
floor division method
. Podział podłogi zaokrągla zero i usuwa przecinek dziesiętny.Represented by //
Dlatego zamiast 2/2 użyj
2//2
Możesz także zaimportować podział
__future__
niezależnie od używania python2 lub python3.Mam nadzieję, że to pomoże!
źródło