您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python2與Python3的區別是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
具體如下:
Python的3??.0版本相對于Python的早期版本,這是一個較大的升級。為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下相容。許多針對早期Python版本設計的程式都無法在Python 3.0上正常執行。為了照顧現有程式,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數。新的Python程式建議使用Python 3.0版本的語法。越來越多的庫要放棄Python 2了,大多數第三方庫都正在努力地相容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7來執行。本片博文就是講述一下Python2.x與3??.x版本區別。
一、print函數
Python 2中print是語句(statement),Python 3中print則變成了函數。在Python 3中調用print需要加上括號,不加括號會報SyntaxError。Python 2.6與Python 2.7部分地支持這種形式的print語法。在Python 2.6與Python 2.7里面,以下三種形式是等價的:
print "123" print ("123") #注意print后面有個空格 print("123") #print()不能帶有任何其它參數 # 然而,Python 2.6實際已經支持新的print()語法: from __future__ import print_function print("123", "456", sep=', ')
二、Unicode
Python 2有兩種字符串類型:str和unicode,Python 3中的字符串默認就是Unicode,Python 3中的str相當于Python 2中的unicode。在Python 2中,如果代碼中包含非英文字符,需要在代碼文件的最開始聲明編碼,如下:
# -*- coding: utf-8 -*-
由于 Python3.X 源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:
>>> 你好 = 'hello' >>>print(你好) hello
Python 2.x:
>>> str = "我愛北京天安門" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我愛北京天安門" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
Python 3.x:
>>> str = "我愛北京天安門" >>> str '我愛北京天安門'
三、除法運算
Python中的除法較其它語言顯得非常高端,有套很復雜的規則。Python中的除法有兩個運算符,/和//。
首先來說/除法:在python 2.x中/除法就跟我們熟悉的大多數語言,比如Java啊C啊差不多,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。在python 3.x中/除法不再這么做了,對于整數之間的相除,結果也會是浮點數。
Python 2.x:
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5
Python 3.x:
>>> 1/2 0.5
而對于//除法,這種除法叫做floor除法,會對除法的結果自動進行一個floor操作,在python 2.x和python 3.x中是一致的。
Python 2.x/Python 3.x相同:
>>> -1 // 2 -1
四、異常處理
在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。捕獲異常的語法由 except exc, var 改為 except exc as var。使用語法except (exc1, exc2) as var可以同時捕獲多種類別的異常。
Python 2.x:
try: 1/0 except ZeroDivisionError, e: print str(e)
Python 3.x(此種方式python 2.x也可用,python 3.x必須帶as):
try: 1/0 except ZeroDivisionError as e: print str(e)
五、xrange
在 Python 2 中 xrange() 創建迭代對象的用法是非常流行的。比如: for 循環或者是列表/集合/字典推導式。這個表現十分像生成器(比如。"惰性求值")。但是這個 xrange-iterable 是無窮的,意味著你可以無限遍歷。由于它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(比如 for 循環)。盡管如此,對比迭代一次,不建議你重復迭代多次,因為生成器每次都從頭開始。在 Python 3 中,range() 是像 xrange() 那樣實現以至于一個專門的 xrange() 函數都不再存在(在 Python 3 中 xrange() 會拋出命名異常)。
簡單來說就是:Python 2中有 range 和 xrange 兩個方法。其區別在于,range返回一個list,在被調用的時候即返回整個序列;xrange返回一個iterator,在每次循環中生成序列的下一個數字。Python 3中不再支持 xrange 方法,Python 3中的 range 方法就相當于 Python 2中的 xrange 方法。
六、map、filter 和 reduce
這三個函數號稱是函數式編程的代表。在 Python3.x 和 Python2.x 中也有了很大的差異。首先我們先簡單的在 Python2.x 的交互下輸入 map 和 filter,看到它們兩者的類型是 built-in function(內置函數):
>>> map <built-in function map> >>> filter <built-in function filter> >>>
但是在Python 3.x中它們卻不是這個樣子了:
>>> map <class 'map'> >>> map(print,[1,2,3]) <map object at 0x10d8bd400> >>> filter <class 'filter'> >>> filter(lambda x:x % 2 == 0, range(10)) <filter object at 0x10d8bd3c8> >>>
首先它們從函數變成了類,其次,它們的返回結果也從當初的列表成了一個可迭代的對象, 我們嘗試用 next 函數來進行手工迭代,對于比較高端的 reduce 函數,它在 Python 3.x 中已經不屬于 built-in 了,被挪到 functools 模塊當中。
七、raw_input()和input()
在python2.x中raw_input()和input( ),兩個函數都存在,其中區別為:
raw_input()
---將所有輸入作為字符串看待,返回字符串類型
input()
---只能接收"數字"的輸入,在對待純數字輸入時具有自己的特性,它返回所輸入的數字的類型(int, float )
在python3.x中raw_input()
和input( )
進行了整合,去除了raw_input()
,僅保留了input()
函數,其接收任意任性輸入,將所有輸入默認為字符串處理,并返回字符串類型。
八、數據類型
1. Python3.x去除了long類型,現在只有一種整型——int,但它的行為就像Python2.x版本的long
2. 新增了bytes類型,對應于2.X版本的八位串,定義一個bytes字面量的方法如下:
>>> b = b'china' >>> type(b) <type 'bytes'> str對象和bytes對象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互轉化。 >>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'
3. dict的.keys()
、.items
和.values()
方法返回迭代器,而之前的iterkeys()
等函數都被廢棄。同時去掉的還有 dict.has_key()
,用 in
替代它吧 。
關于“Python2與Python3的區別是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。