2014-03-05 48 views
1

當python3使用地板除法(也許還與未來 python2),如,例如,在蟒3地板分割並不總是導致一個int

>>> 2//2 
1 

輸出是整數如預期。但只要一個操作數是浮點數,你會得到一個浮動的結果

>>> 2.0//2.0 
1.0 
>>> 2.0//2 
1.0 
>>> 2//2.0 
1.0 

我想這是有意的,但實際上我不明白,爲什麼它應該是這個樣子。使用以前確定的數據類型作爲總是產生整數的操作的結果的設計概念是什麼?

一個非常廣泛的搜索給了我(從PEP 238)的最佳

樓司的語義

樓師將在所有的Python數字 類型來實施,將有

語義
a // b == floor(a/b) 

除了結果類型是在t之前強制 和b的公共類型他操作。

具體地,如果a和b是相同類型的,一個// B將是 該類型太。如果輸入是不同類型的,那麼它們是 首先使用與其他算術運算符相同的規則強制爲一個通用類型。

特別是,如果a和b均爲整數或多頭,結果具有 相同的類型和值作爲用於對這些類型 (包括混合輸入類型的情況下,經典劃分; INT //長和長//int 都會返回一個很長的)。

對於浮點輸入,結果是浮點數。例如:

3.5//2.0 == 1.0 

爲複數,//引發一個例外,因爲地板(一個 複數)是不允許的。

對於用戶定義的類和擴展類型,所有語義是向上 到類或類型的實現。

但是這仍然沒有解釋爲什麼行爲是這樣實現的。

+0

「對於浮點輸入,結果是一個浮點數」,所以......也許輸入處的「s」誤導 – 2014-03-05 21:06:54

+0

爲什麼不能?有一個很好的文檔輸出類型... – mgilson

+0

@mgilson「充分記錄的輸出時間」也可以是「int」。 – delnan

回答

5

一個可能的優點可能如下:如果操作的輸入是float s,那麼通常最有用的輸出類型是float,因爲程序正在執行浮點計算。類似地,如果一個操作的輸入爲整數(int S或long多個),然後通常是最有用的輸出類型是一個整數。

一個相關的令人驚訝的數據點:

>>> str(int(123e300 // 10.0)) 
'12300000000000000348405169443457756499452463917650245579212965288916278422109198944984236481408634018703901759913201583616648277756338685989513894763895354330869046350917957229381143786183918719192956157930593465276658607709014541611368487360619735051905095032755082564499801643679232993692080863707136' 

這是令人驚訝的,因爲它是自然的,在年底預計很多0秒。由於float類型的有限精度,您會得到其他數字。

所以通過返回float,//表示輸出可能不準確。

0

這使得地板劃分與其他算術運算一致。好處是,不要忘記//是一種特殊情況,您可以使用您現有的知識和編碼模式。和所有其他運營商一樣,如果你想強制輸出爲int,你應該明確強調它是這樣的。