想必現在大家學習Python都會用3.0及以上的版本了,雖然2.X的版本依然很多,但是這兩年隨着部分開源項目不再支持2.X版本,3.X已經成為趨勢。
正是在這樣的大背景下,我最近用這本《Python基礎教程》做教材的時候,發現作者的語句主要是基於Python 2.5版本寫成的,2014年進行第二版修訂的時候,也沒有明確出2.X與3.X的區別,但是現在這些語句會對使用3.X版本的初學者朋友引起誤導,下面我就隨着這本書的使用過程,更新一下遇到的一些問題,希望遇到問題的初學者們不要感到困擾。
首先說一下教材的信息,因為版本很重要
《Python基礎教程(第2版 修訂版)》 ISBN:9787115353528
問題及解決思路如下,不斷更新,我也是新人,望批評指正。
1.關於input和raw_input
在1.11.4節(21頁)提到input和raw_input的比較,但是在3.X的Python版本中,已經用input代替了raw_input了,本小節最后還特別提醒“除非對input有特別的需要,否則應該盡可能使用raw_input函數”,這句話可能在2.X的版本中適用,但是在3.X的版本是無效的,在這里應該單獨點一下兩個版本在這兩個函數上的差異呢,而不是直接提倡用raw_input函數,因為在3.X版本中raw_input已經不存在了。
2.關於print
print在3.X的版本中print已經成為一個函數,因此直接用 print “Hello,World!”此類的語句,就會報錯了,望初學者注意,要用print(參數),同樣的,exce在Python3.X的版本中同print有相同的變化,作為函數使用,同樣exce使用方式也發生了此類變化。
關於print,作為函數使用,其實與C語言的printf()函數的使用方式類似,只是Python里的函數使用方式更加靈活多變。
通過help(print)可以看到print函數的參數列表如下所示:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
其中value是輸入值,可以有多個參數,傳遞到print函數里面是作為元祖(param1,param2,……)處理的,之后的幾個關鍵詞函數參數分別控制着輸出格式等。
sep:指定前面傳入的一系列參數之間用什么符號連接,默認是空格
end:指定輸出后最后一個字符是什么,默認是換行符,但是可以根據實際情況設置不換行為空或者其它特殊符號等,這也解決了Python2經常print輸出自動換行不容易控制的問題
file:指定輸出內容到哪個文件中,默認就是輸出到當前的標准輸出流里。
flush:用來指示緩存的開關標志,默認為False,既輸出在內存緩存里,不刷新到文件中,當值為True時,輸出的內容會立即刷新到輸出文件中。
3.內建函數cmp
cmp內建函數在Python 3.X中已經被刪除了,被operator模塊中的函數代替,如果想做比較功能,可以考慮導入operator模塊,用以下函數實現:
1 operator.lt(a, b) 2 operator.le(a, b) 3 operator.eq(a, b) 4 operator.ne(a, b) 5 operator.ge(a, b) 6 operator.gt(a, b) 7 operator.__lt__(a, b) 8 operator.__le__(a, b) 9 operator.__eq__(a, b) 10 operator.__ne__(a, b) 11 operator.__ge__(a, b) 12 operator.__gt__(a, b)
lt(a, b) 相當於 a < b #less than 小於
le(a,b) 相當於 a <= b #less than or equal 小於等於
eq(a,b) 相當於 a == b #equal 等於
ne(a,b) 相當於 a != b #not equal 不等於
ge(a, b)相當於 a>= b #greater equal 大於等於
gt(a,b) 相當於 a > b #greater than 大於
這些函數的返回值為布爾值
4.關於字符串格式化的問題
這個問題只是在這里簡單一提,詳細的使用方法大家可以去參照文檔的介紹或者Google
Python 2.X中使用從C語言借鑒來的格式化方法,如 "%s %d %f" % (str, int , float)這個樣式,在Python 3.X的版本中,為了更靈活的使用Python的數據結構(列表、元祖、字典、集合),新版本中推薦使用format函數進行字符串格式化,也更加靈活了,具體使用大家自己查查資料。
5.關於字典的方法has_key()
Python 3.X的版本中,判斷字典中是否含有某個鍵時,已經無法使用has_key()的方式,只能用in,如‘name’ in d,另外,in的效率也比has_key()的效率高,因為不管是為了代碼兼容還是效率問題,推薦使用in。
6.關於范圍函數range()與xrange()
在Python 3.X中,range被轉換成xrange風格的函數,因此xrange在3.X的版本中就沒有存在的必要了,直接用range就行。
7.數據類型long
在Python3.X的版本中,long類型已經不存在了,老int和long的范圍統一使用int表示,可以進行高精度運算。