接上一篇 ?
PS: 在本篇中 你會(huì)了解到:
1.Python3.5 在Linux平臺(tái)上的安裝步驟?
2.Python3.5 與Python2.7 的區(qū)別
不一會(huì)兒, 小李又來找志強(qiáng)了,"師兄, 那個(gè)啥.....我是應(yīng)該安裝Python2.7還是Python3.5呢? 我在官網(wǎng)上看的版本說明看的頭大?"
志強(qiáng)聽了,說道:"我應(yīng)該學(xué)習(xí)哪個(gè)版本的Python烘跺。對于這個(gè)問題势似,對于初學(xué)者來說很常見. 我的回答是“先選擇一個(gè)最適合你的Python教程耳奕,教程中使用哪個(gè)版本的Python襟沮,你就用哪一個(gè)版本。教程的選取可以從書籍資料跪腹、教學(xué)視頻褂删、實(shí)例代碼這三個(gè)方面來參考。學(xué)得差不多了冲茸,再來研究不同版本之間的差別.? 大部分Python庫都同時(shí)支持Python 2.7.x和3.x版本的屯阀,所以不論選擇哪個(gè)版本都是可以的。但為了在使用Python時(shí)避開某些版本中一些常見的陷阱或需要移植某個(gè)Python項(xiàng)目時(shí)轴术,依然有必要了解一下Python兩個(gè)常見版本之間的主要區(qū)別不過既然你問了难衰,我也不妨給你解答一下 : "
Python3.5 與Python2.7 的區(qū)別
PS: 這里會(huì)簡單的敘述Python3.5 和Python2.7幾個(gè)比較重要的區(qū)別 。Python 3.x引入了一些與Python 2不兼容的關(guān)鍵字和特性逗栽,在Python2中盖袭,可以通過內(nèi)置的__future__模塊導(dǎo)入這些新內(nèi)容。如果你希望在Python 2環(huán)境下寫的代碼也可以在Python3.x中運(yùn)行彼宠,那么建議使用__future__模塊鳄虱。例如,如果希望在Python 2中擁有Python 3.x的整數(shù)除法行為凭峡,可以通過下面的語句導(dǎo)入相應(yīng)的模塊拙已。
from__future__import division
至于更多的細(xì)節(jié),可以參看這里?
1.? print函數(shù)
Python 2中的print語句被Python 3中的print()函數(shù)取代摧冀,這意味著在Python 3中必須用括號(hào)將需要輸出的對象括起來倍踪。Python3.5語法要比之前更為嚴(yán)格霉涨。
在Python 2中使用額外的括號(hào)也是可以的, 但是在Python3中卻是必須帶括號(hào)的,否則會(huì)引起SyntaxError
# 可以嘗試著在Python2/3 環(huán)境下輸入一下語句惭适,體驗(yàn)一下區(qū)別
print 'Hello, World!'
print('Hello, World!')
2. 整數(shù)除法
Python3 在除法上對Python2 進(jìn)行了改進(jìn):
Python 3在整數(shù)除法上的改動(dòng)(寫錯(cuò)了也不會(huì)觸發(fā)Syntax Error),所以在移植代碼或在Python 2中執(zhí)行Python 3的代碼時(shí)楼镐,需要特別注意這個(gè)改動(dòng)癞志。
所以,我還是會(huì)在Python 3的腳本中嘗試用float(3)/2或 3/2.0代替3/2框产,以此來避免代碼在Python2環(huán)境下可能導(dǎo)致的錯(cuò)誤(或與之相反凄杯,在Python 2腳本中用from __future__ import division來使用Python3的除法)
print('Python', python_version())
##嘗試采用不同的環(huán)境來檢查結(jié)果
print('3 / 2 =',3/2)
print('3 // 2 =',3//2)
print('3 / 2.0 =',3/2.0)
print('3 // 2.0 =',3//2.0)
3. Unicode
Python 2有基于ASCII的str()類型,其可通過單獨(dú)的unicode()函數(shù)轉(zhuǎn)成unicode類型秉宿,但沒有byte類型戒突。而在Python 3中,終于有了Unicode(utf-8)字符串描睦,以及兩個(gè)字節(jié)類:bytes和bytearrays膊存。
print type(unicode('this is like a python3 str type'))?
print type(b'byte type does not exist')
print('strings are now utf-8 u03BCnicou0394é!')
print(' also has',type(bytearray(b'bytearrays')))
4. xrange
在Python 2.x中,經(jīng)常會(huì)用xrange()創(chuàng)建一個(gè)可迭代對象忱叭,通常出現(xiàn)在“for循環(huán)”或“列表/集合/字典推導(dǎo)式”中隔崎。
這種行為與生成器非常相似(如”惰性求值“),但這里的xrange-iterable無盡的韵丑,意味著可能在這個(gè)xrange上無限迭代爵卒。
由于xrange的“惰性求知“特性,如果只需迭代一次(如for循環(huán)中)撵彻,range()通常比xrange()快一些钓株。不過不建議在多次迭代中使用range(),因?yàn)閞ange()每次都會(huì)在內(nèi)存中重新生成一個(gè)列表陌僵。
在Python 3中轴合,range()的實(shí)現(xiàn)方式與xrange()函數(shù)相同,所以就不存在專用的xrange()(在Python 3中使用xrange()會(huì)觸發(fā)NameError)碗短。
PS: 這里暫時(shí)不對xrange()和range展開值桩,后期會(huì)有對Python2.7 下的xrange /range 的話題
5.異常
Python 2支持新舊兩種異常觸發(fā)語法,而Python 3只接受帶括號(hào)的的語法(不然會(huì)觸發(fā)SyntaxError)
PS: 這里也不做過多的介紹豪椿,后期會(huì)詳細(xì)介紹奔坟。
6. 異常處理
在Python 2 中的異常處理一般是這種形式
print 'Python', python_version()
try:
????? let_us_cause_a_NameError
except NameError, err:
????? print? err,'--> our error message'
但是在Python3.5中是這樣的:
print('Python', python_version())
try:
?? let_us_cause_a_NameError
except? NameError as err:? #? as 作為別名
??? print(err,'--> our error message')
2. next()函數(shù)和.next()方法
由于會(huì)經(jīng)常用到next()(.next())函數(shù)),所以還要提到另一個(gè)語法改動(dòng)(實(shí)現(xiàn)方面也做了改動(dòng)):在Python
2.7.5中搭盾,函數(shù)形式和方法形式都可以使用咳秉,而在Python3中,只能使用next()函數(shù)(試圖調(diào)用.next()方法會(huì)觸發(fā)AttributeError)鸯隅。
# 再舉一個(gè)栗子:
my_generator=(letter for letter in'abcdefg') # 生成了一個(gè)list
#在python2.7 中調(diào)用
my_generator.next()
#在Python3.5中調(diào)用
next(my_generator)? # 輸出的 'a'
my_generator.next()? # 拋出異常
#Python2.7 中調(diào)用
my_generator.next() # 輸出的是'b'
For循環(huán)變量與全局命名空間泄漏
這個(gè)也應(yīng)該是好消息: 在Python 3.x中澜建,for循環(huán)中的變量不再會(huì)泄漏到全局命名空間中了向挖。
這是Python 3.x中做的一個(gè)改動(dòng),在“What's New In Python 3.0”中有如下描述:
“列表推導(dǎo)不再支持[... for var in item1, item2, ...]這樣的語法炕舵,使用[... for var in
(item1, item2,
...)]代替何之。還要注意列表推導(dǎo)有不同的語義:現(xiàn)在列表推導(dǎo)更接近list()構(gòu)造器中的生成器表達(dá)式這樣的語法糖,特別要注意的是咽筋,循環(huán)控制變量不會(huì)再泄漏到循環(huán)周圍的空間中了溶推。”
相關(guān)的資料:
awesome features of Python that you can't use because you refuse to upgrade to Python 3
關(guān)于你不想知道的所有Python3 unicode特性
Should I use Python 2 or Python 3 for my development activity?
Porting Python 2 Code to Python 3
How keep Python 3 moving forward
聽了志強(qiáng)的一番陳述. 小李似乎對Python3.5 更有興趣了.? 于是小李開始動(dòng)手安裝Python3.5了奸攻;
"嘿蒜危,等等",志強(qiáng)對小李說:"記得把安裝手冊發(fā)個(gè)我啊";
不一會(huì)兒睹耐, 小李便把安裝手冊發(fā)給我了志強(qiáng)辐赞。。硝训。响委。
Linux環(huán)境下編譯安裝python3
由于一般的Linux系統(tǒng)下默認(rèn)系統(tǒng)自帶python2.*的版本,這個(gè)版本被系統(tǒng)很多程序所依賴窖梁,所以不建議刪除晃酒,如果使用最新的Python3那么我們知道編譯安裝源碼包和系統(tǒng)默認(rèn)包之間是沒有任何影響的,所以可以安裝python3和python2共存窄绒。
首先去python官網(wǎng)下載python3的源碼包贝次,網(wǎng)址:https://www.python.org/
1 安裝
./configure --prefix=/usr/python? #添加配置,指定安裝目錄
make -j40 # 編譯python , j后面的數(shù)字和系統(tǒng)CPU核數(shù)有關(guān)彰导,普通的設(shè)置為j4就好了
sudo make install? # 執(zhí)行安裝
如圖所示:
整個(gè)過程大約5-10分鐘蛔翅,安裝成功之后,安裝目錄就在/usr/python
系統(tǒng)中原來的python在/usr/bin/python位谋,通過ls -l可以看到山析,python是一個(gè)軟鏈接,鏈接到本目錄下的python2.6.
我們可以把這個(gè)刪除掏父,也可以新建一個(gè)python3的軟鏈接笋轨,只不過執(zhí)行時(shí)python要改成python3,或者python腳本頭部聲明要改為#!/usr/bin/python3
這里為了方便建議先重命名一下赊淑,然后建立個(gè)軟鏈接就可以了爵政,之前的程序頭部也不用更改:
## 修改系統(tǒng)默認(rèn)版本
$sudo mv /usr/bin/python /usr/bin/python.bak
$sudo ln -s /usr/python/bin/python3 /usr/bin/python
##修改本地用戶版本
$sudo mv /usr/bin/python /usr/bin/python2.6 ##對系統(tǒng)默認(rèn)版本python進(jìn)行操作
這樣就建立好了,以后直接執(zhí)行python命令陶缺,就相當(dāng)于調(diào)用python3钾挟,實(shí)際上python3也是個(gè)軟鏈接,鏈接到python3.5.1饱岸,這個(gè)多次鏈接其實(shí)不影響掺出,主要是為了版本升級(jí)更加方便徽千,不用改版本號(hào)了
嘗試著使用 python –V 命令:
(如果在sudo python –V 中顯示python3.5 , 但是在python -V 顯示為python2.7, 請選擇重新啟動(dòng)服務(wù)器)
疑問或問題
3.1 如果還想使用python2.7 怎么辦?
在原有的python 文件的第一行中添加python2.7 的路徑:
#!/usr/bin/python.bak
或者是
#!/usr/bin/python2.7*
以上兩句都是用于指定使用python 的版本.
3.2 接下來是另一個(gè)問題: pip2.7 與pip3 的問題:
注意:當(dāng)安裝好新版本的python后,會(huì)出現(xiàn) pip2 和pip3 ; 這兩個(gè)命令是有區(qū)別的,區(qū)別如下:
1- 安裝的后的包位置不同
2- Pip2 /3 安裝后都是僅適用于各自版本汤锨。
志強(qiáng)看過以后對小李說到: "嗯双抽, 寫的還可以。那明天開始動(dòng)手練習(xí)Python的基本語法和數(shù)據(jù)結(jié)構(gòu)吧"