首頁  >  文章  >  後端開發  >  講解 python2與3的區別

講解 python2與3的區別

coldplay.xixi
coldplay.xixi轉載
2021-01-11 09:28:483218瀏覽

講解 python2與3的區別

相關免費學習推薦:python影片教學

python2和python3的區別

  • 區別
  • 一、python3.0的一些變化
    • #1.print函數
    • 2.Unicode
    • 3.除法運算
    • 4.異常
    • 5.xrange
    • 6.八進位字面量表示
    • 7.不等運算子
    • 8.去掉了repr表達式"
    • 9.多個模組被改名(根據PEP8)
    • 10 .資料類型
  • 總結

#區別

  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中不等于 !=和a8093152e673feb7aba1828c43532094
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&#39;lalala&#39;type(b)#输出<type &#39;bytes&#39;>

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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除