本文實例總結了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里面,以下三種形式是等價的:
1
2
3
4
5
6
|
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中,如果代碼中包含非英文字符,需要在代碼文件的最開始聲明編碼,如下:
1
|
# -*- coding: utf-8 -*- |
由于 Python3.X 源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:
1
2
3
|
>>> 你好 = 'hello' >>> print (你好) hello |
Python 2.x:
1
2
3
4
5
6
|
>>> str = "我愛北京天安門" >>> str '我愛北京天安門' >>> str = u "我愛北京天安門" >>> str u 'u6211u7231u5317u4eacu5929u5b89u95e8' |
Python 3.x:
1
2
3
|
>>> str = "我愛北京天安門" >>> str '我愛北京天安門' |
三、除法運算
Python中的除法較其它語言顯得非常高端,有套很復雜的規則。Python中的除法有兩個運算符,/和//。
首先來說/除法:在python 2.x中/除法就跟我們熟悉的大多數語言,比如Java啊C啊差不多,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。在python 3.x中/除法不再這么做了,對于整數之間的相除,結果也會是浮點數。
Python 2.x:
1
2
3
4
|
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5 |
Python 3.x:
1
2
|
>>> 1 / 2 0.5 |
而對于//除法,這種除法叫做floor除法,會對除法的結果自動進行一個floor操作,在python 2.x和python 3.x中是一致的。
Python 2.x/Python 3.x相同:
1
2
|
>>> - 1 / / 2 - 1 |
四、異常處理
在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。捕獲異常的語法由 except exc, var 改為 except exc as var。使用語法except (exc1, exc2) as var可以同時捕獲多種類別的異常。
Python 2.x:
1
2
3
4
|
try : 1 / 0 except ZeroDivisionError, e: print str (e) |
Python 3.x(此種方式python 2.x也可用,python 3.x必須帶as):
1
2
3
4
|
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(內置函數):
1
2
3
4
5
|
>>> map <built - in function map > >>> filter <built - in function filter > >>> |
但是在Python 3.x中它們卻不是這個樣子了:
1
2
3
4
5
6
7
8
9
|
>>> 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字面量的方法如下:
1
2
3
4
5
6
7
8
9
10
|
>>> 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
替代它吧 。
這是最近整理的一些資料,并不是很全面,還有其他不同之處后續努力更新。
希望本文所述對大家Python程序設計有所幫助。
原文鏈接:https://blog.csdn.net/Zhihua_W/article/details/79651488