相關免費學習推薦:python影片教學
python2和python3的區別
#區別
python的3.0版本,常被稱為python3000,簡稱py3k。相對於python的早期版本,這是一個較大的升級為了不帶入過多累贅,python3.0在設計的時候沒有考慮向下相容。
許多針對早期python版本設計的程序都無法在python3.0上正常執行。為了照顧現有程序,python2.6作為一個過渡版本,基本上使用了python2.x的語法和庫,同時考慮了向python3.0的遷移,允許使用部分python3.0的語法與函數。
新的python程式建議使用python3.0版本的語法。除非執行環境無法安裝python3.0或程式本身使用了不支援python3.0的第三方函式庫。目前不支援python的第三方函式庫有Twisted,py2exe,PIL等。
大多數第三方函式庫都正在努力的兼容python3.0版本。即使無法立即使用python3.0,也建議編寫相容的3.0版本python程序,然後使用2.6,2.7來執行。
一、python3.0的一些變化
1.print函數
# print語句沒有了,取而代之的是print()函數。python2.6與python2.7部分的支援這種形式的print語法。在python2.6與2.7裡面以下三種形式是等價的
print "我是菜鸟"print (我是菜鸟) #注意print后边有个空格print("我是菜鸟") #print()不能带有其他任何参数
然而python2.6實際上已經支援新的print()語法
from _future_import print_functionprint("我是个菜鸟","我好菜啊",sep=', ')
2.Unicode
python2有ASCII str()類型,unicode ()是單獨的,不是byte型。現在python3有了Unicode(utf-8)字串,以及一個位元組類別:byte和bytearrays。由於python3.x原始碼檔案預設使用utf-8編碼,這使得以下程式碼合法
我没女友='I have no girlfriends'print(我没女友)
3.除法運算
python中的除法相較於其他語言會高階一些有些很複雜的規則,python中的除法有/與//兩個運算子。
先說除法,python2.x和大多數語言一樣,例如java和c,整數相除結果是一個整數,把小數部分完全忽略掉,浮點數的除法會保留小數點的部分得到的一個浮點數結果。
python3.x中除法就不再這樣做了,對於整數間的相除結果也會是浮點數。 (這裡可以用0/1來理解)
而對於//除法,這種除法叫floor除法,會對除法的結果自動進行一個floor操作,在python2.x和3.x中是一致的。
#python2.x与3.x-1//2 #输出值是-1
注意的不是捨棄小數部分,而是執行floor操作,如果要截取小數部分,那麼就需要使用math模組的trunc函數。
4.異常
在python3中處理異常也輕微改變了,在python3中,我們使用as作為關鍵字。捕獲異常的語法由 except exc,var改為 except exc as var。
使用語法except(exc1,exc2) as var可以同時捕捉多種類別的例外。 python2.6已經支援這兩種語法。
·在2.x時代,所有類型的物件都是可以直接拋出的,在3.x時代只有繼承BaseException的物件才可被拋出。
·2.x raise語句使用逗號將拋出物件類型和參數分開,3.x取消了這種奇葩寫法,直接呼叫建構子拋出物件即可。
在2.x時代,異常在程式碼中除了表示程式錯誤,還常做一些普通控制結構應該做的事,在3.x中可以看出,設計者讓異常變得更加專一,只有在錯誤發生的情況下才能用去用異常捕獲語句來處理。
5.xrange
在python2中xrange()建立迭代物件的用法是非常流行的。例如:for迴圈或是列表/集合/字典推導式。
這個表現十分像生成器(例如:「惰性求值」)。但這個xrange-iterable是無窮的,代表你可以無限遍歷。
由於它的惰性求值,如果你要遍歷它多次,xrange()函數比range()函數更快(例如for迴圈)。儘管如此,對比迭代一次,不建議你迭代多次,因此生成器每次都從頭開始。
在python3中,range()是像xrange()那樣實現,以至於一個專門的xrange()函數都不再存在(在python3中xrange()會拋出命名異常。
6.八進位字面量表示
#八进制必须写成0o777,原来的形式0777不能用了;二进制0b111。新增了一个bin()函数用于将一个整数转换成二进制字串。python2.6已经支持这两种语法
7.不等运算符
python2.x中不等于 !=和<>
python3.x中不等于只有!=
8.去掉了repr表达式"
python2.x中反引号"相当于repr函数的作用
python3.x中去掉了"这种写法,只允许repr函数,感觉repr只有debug的时候才用,多数时候还是用str函数来用字符串描述对象。
9.多个模块被改名(根据PEP8)
旧名字 | 新名字 |
---|---|
_winreg | winreg |
ConfigParser | configparser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
repr | reprlib |
StringIO模块现在被合并到新的io模组内new,md5,gopherlib等模块被删除 。python2.6已经支援新的io模组。
httplibBase,HTTPServer,CGIHTTPServer,SimpleHTTPServer,Cookie,cookerlib被合并到http包内。取消了exec语句只剩下exec()函数。python2.6已经支援exec()函数。
10.数据类型
python3.x去除了long类型,现在只有一种整型——int
新增了bytes类型,对应于2.x版本的八位串,定义一个butes字面量方法如下
b=b'lalala'type(b)#输出<type 'bytes'>
str对象和bytes对象可以使用encode()(str->bytes)or.decode()(bytes->str)方法互相转换。
s=b.decode()b1=s.encode()
dict的.keys()、.items和.values()方法返回迭代器,而之前的iterkeys()等函数都被遗弃。同事去掉的还有dict.has_key(),用in替代它吧>_<。
总结
总之一句话,用python3吧,不要再倔强了!
才开始学习计算机不久,第一次写博客,如果有问题希望大家指正,希望我们能一起学习一起进步。共勉!
以上是講解 python2與3的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!