2010-08-20 69 views
1

我開始在2001年使用Python我喜歡語言的簡潔,只有一個功能,惹惱了赫克了我是/運營商,這將咬我在微妙的地方,如爲什麼Python程序員仍然使用舊式的劃分?

def mean(seq): 
    """ 
    Return the arithmetic mean of a list 
    (unless it just happens to contain all ints) 
    """ 
    return sum(seq)/len(seq) 

幸運的是,PEP 238已經寫好了,當我發現新的聲明時,我開始虔誠地將它添加到我寫的每個.py文件中。

但是這裏差不多9年過去了,我還經常看到Python code samplesuse / for integer division//不是一個廣爲人知的功能嗎?還是有一個理由更喜歡舊的方式?

+0

未來分區也是我最喜歡的分區之一 – 2010-08-20 05:13:07

回答

8

我認爲//截斷是相當有名的,但人們不願意從他們編寫的模塊中「導入未來」。經典的方法(使用float(sum(seq))等等得到一個浮點型結果,int(...)截斷否則浮點型除法)是你在C++中使用的方法(在C,Java,Fortran中使用略有不同的語法, ...),以及包含2.7版本的每個Python版本中的「本地」,所以如果很多人習慣於並且習慣於使用「經典方法」,這並不奇怪。

當Python 3變得比Python 2更廣泛和更廣泛使用時,我希望事情發生改變。

2

您可以更改的/行爲對整個解釋,如果你喜歡,所以沒有必要從未來的每一個模塊

$ python -c "print 1/2" 
0 
$ python -Qwarn -c "print 1/2" 
-c:1: DeprecationWarning: classic int division 
0 
$ python -Qnew -c "print 1/2" 
0.5 
+4

如果您正在編寫由其他人運行的代碼,那麼您如何強制他們使用您的首選選項運行它?看起來像那些「在我的機器上爲我工作」的「解決方案」之一。 – 2010-08-20 06:37:41

+3

@John,我猜想你會使用一個.bat來運行python和正確的選項。在unix/linux中,您可以將選項添加到shebang行。大多數情況下,'-Qwarn'對於找到可以從'/'升級到'//'而不會破壞任何東西的地方很有用 – 2010-08-20 07:01:52

+2

我寧願使代碼正常工作,而不管命令行選項如何。當分發軟件包/模塊時,選項並不多。 – 2010-08-20 09:22:57

1

對我來說總是有意義了將使用int給人和INT進口導致通常在飛行類型轉換中不會執行的語言。

+0

我同意。運營商已經針對不同類型做了不同的事情。想想+來添加/連接。 – thieger 2010-08-20 10:45:54

+3

我不同意。想象一下,如果'math.sqrt(2)'返回1而不是1.4142135623730951。在Python 2.1中,除了*除外,'int'在所有情況下都是'float'的完美替代品。 – dan04 2010-08-20 13:15:29

+0

@ dan04:太糟糕了,更多的語言不能根據結果做什麼來推斷使用的操作符的類型。如果f1-f2是浮點數並且d1是雙精度浮點數,並且一個正在計算f2 = f1 + 0.1;那麼將0.1浮點數轉換爲浮點數並使用浮點數執行相加是有意義的,但是如果計算'd1 = f1 + f2;'將這些操作數轉換爲double並進行計算會更有意義。運營商應該產生相同的結果類型,因爲它們的操作數很容易實現,但是恕我直言很糟糕並且容易導致錯誤。 – supercat 2013-11-13 21:20:18

相關問題