python27和3區別
① python2和3的區別大嗎
1、Python2之前是非常受歡迎的,現在很多軟體公司依然使用的是Python2,不過由於越來越多的公司開始從Python2遷移到3,因此初學者可以避免花費更多的時間學習過去的版本了。
2、Python2和Python3之間有一些是無法互相兼容的,現在很多開發人員都在使用Python3開發庫,許多老的基於Python2的開發包依然是無法兼容的,想要將Python2庫移植到Python3上,對於初學者來說還是比較困難的事情。
3、Python3有更好的Unicode編碼支持在Python3的語法之中,默認文化字元串就是Unicode,而Python2默認的存儲為ASCII,而且Unicode比ASCII更加通用,可以提供更多的選擇。
4、Python3版本改進了整數除法的問題,在Python2中如果你在小數點後面寫任何一個數字,計算會自動四捨五入的。而使用Python3的情況下是不需要擔心這種情況發生的。
5、兩個版本之間有不同的列印語句聲明語法,是語法差異,不影響Python的功能。
② python2和python3的區別,轉換及共存
python2和python3的區別
1.性能
Py3.0運行 pystone benchmark的速度比Py2.5慢30%。Guido認為Py3.0有極大的優化空間,在字元串和整形操作上可以取得很好的優化結果。
Py3.1性能比Py2.5慢15%,還有很大的提升空間。
2.編碼
Py3.X源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:
>>> 中國 = 'china'
>>>print(中國)
china
3. 語法
1)去除了<>,全部改用!=
在Python 2里,為了得到一個任意對象的字元串表示,有一種把對象包裝在反引號里(比如`x`)的特殊語法。在Python 3里,這種能力仍然存在,但是你不能再使用反引號獲得這種字元串表示了。你需要使用全局函數repr()。
Notes
Python 2
Python 3
①
`x` repr(x)
②
`'PapayaWhip' + `2`` repr('PapayaWhip'+repr(2))
Note:x可以是任何東西—一個類,函數,模塊,基本數據類型,等等。repr()函數可以使用任何類型的參數。
2)去除``,全部改用repr()
3)關鍵詞加入as 和with,還有True,False,None
4)整型除法返回浮點數,要得到整型結果,請使用//
由於人們常常會忽視Python 3在整數除法上的改動(寫錯了也不會觸發Syntax Error),所以在移植代碼或在Python 2中執行Python 3的代碼時,需要特別注意這個改動。
所以,我還是會在Python 3的腳本中嘗試用float(3)/2或 3/2.0代替3/2,以此來避免代碼在Python 2環境下可能導致的錯誤(或與之相反,在Python 2腳本中用from __future__ import division來使用Python 3的除法)。
Python 2
print'3/2=',3/2print'3//2=',3//2print'3/2.0=',3/2.0print'3//2.0=',3//2.0
3/2=13//2=13/2.0=1.53//2.0=1.0
默認,如果兩個操作數都是整數,Python 2 自動執行整型計算。
Python 3
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/2=1.53//2=13/2.0=1.53//2.0=1.0
Note: 需要注意的是「雙劃線」(//)操作符將一直執行整除,而不管操作數的類型,這就是為什麼 5.0//2.0 值為 2.0。Python 3 中,/ 操作符是做浮點除法,而 // 是做整除(即商沒有餘數,比如 10 // 3 其結果就為 3,余數會被截除掉,而 (-7) // 3 的結果卻是 -3。這個演算法與其它很多編程語言不一樣,需要注意,它們的整除運算會向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一樣。
5)加入nonlocal語句。使用noclocal x可以直接指派外圍(非全局)變數
6)print
去除print語句,加入print()函數實現相同的功能。同樣的還有 exec語句,已經改為exec()函數
在Python 2里,print是一個語句。無論你想輸出什麼,只要將它們放在print關鍵字後邊就可以。
Python 3里,print()是一個函數。就像其他的函數一樣,print()需要你將想要輸出的東西作為參數傳給它。
例如:
2.X: print "The answer is", 2*2
3.X: print("The answer is", 2*2)
2.X: print x, # 使用逗號結尾禁止換行
3.X: print(x, end=" ") # 使用空格代替換行
在Python 2里,如果你使用一個逗號(,)作為print語句的結尾,它將會用空格分隔輸出的結果,然後在輸出一個尾隨的空格(trailing space),而不輸出回車(carriage return)。在Python 3里,通過把end=' '作為一個關鍵字參數傳給print()可以實現同樣的效果。參數end的默認值為'
',所以通過重新指定end參數的值,可以取消在末尾輸出回車符。
2.X: print # 輸出新行
3.X: print() # 輸出新行
2.X: print >>sys.stderr, "fatal error"
3.X: print("fatal error", file=sys.stderr)
在Python 2里,你可以通過使用>>pipe_name語法,把輸出重定向到一個管道,比如sys.stderr。在Python 3里,你可以通過將管道作為關鍵字參數file的值傳遞給print()來完成同樣的功能。參數file的默認值為std.stdout,所以重新指定它的值將會使print()輸出到一個另外一個管道。
2.X: print (x, y) # 輸出repr((x, y))
3.X: print((x, y)) # 不同於print(x, y)!
exec語句
exec()函數使用一個包含任意Python代碼的字元串作為參數,然後就像執行語句或者表達式一樣執行它。exec()跟eval()是相似的,但是exec()更加強大並更具有技巧性。eval()函數只能執行單獨一條表達式,但是exec()能夠執行多條語句,導入(import),函數聲明—實際上整個Python程序的字元串表示也可以。
Notes
Python 2
Python 3
①
execcodeString exec(codeString)
②
execcodeStringina_global_namespace exec(codeString,a_global_namespace)
③
execcodeStringina_global_namespace,a_local_namespace exec(codeString,a_global_namespace,a_local_namespace)
在最簡單的形式下,因為exec()現在是一個函數,而不是語句,2to3會把這個字元串形式的代碼用括弧圍起來。
Python 2里的exec語句可以指定名字空間,代碼將在這個由全局對象組成的私有空間里執行。Python 3也有這樣的功能;你只需要把這個名字空間作為第二個參數傳遞給exec()函數。
更加神奇的是,Python 2里的exec語句還可以指定一個本地名字空間(比如一個函數里聲明的變數)。在Python 3里,exec()函數也有這樣的功能。
- execfile('a_filename') exec(compile(open('a_filename').read(),'a_filename','exec'))
- for line in a_file.xreadlines(): for line in a_file:
- for line in a_file.xreadlines(5): no change (broken)
如果你以前調用沒有參數的xreadlines(),2to3會把它轉換成文件對象本身。在Python 3里,這種轉換後的代碼可以完成前同樣的工作:一次讀取文件的一行,然後執行for循環的循環體。
如果你以前使用一個參數(每次讀取的行數)調用xreadlines(),2to3不能為你完成從Python 2到Python 3的轉換,你的代碼會以這樣的方式失敗:AttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'。你可以手工的把xreadlines()改成readlines()以使代碼能在Python 3下工作。(readline()方法在Python 3里返回迭代器,所以它跟Python 2里的xreadlines()效率是不相上下的。)
- u'PapayaWhip' 'PapayaWhip'
- ur'PapayaWhipfoo' r'PapayaWhipfoo'
Python 2里的Unicode字元串在Python 3里即普通字元串,因為在Python 3里字元串總是Unicode形式的。
Unicode原始字元串(raw string)(使用這種字元串,Python不會自動轉義反斜線"")也被替換為普通的字元串,因為在Python 3里,所有原始字元串都是以Unicode編碼的。
- unicode(anything) str(anything)
- from sys import maxint from sys import maxsize
execfile語句
就像以前的exec語句,Python 2里的execfile語句也可以像執行Python代碼那樣使用字元串。不同的是exec使用字元串,而execfile則使用文件。在Python 3里,execfile語句已經被去掉了。如果你真的想要執行一個文件里的Python代碼(但是你不想導入它),你可以通過打開這個文件,讀取它的內容,然後調用compile()全局函數強制Python解釋器編譯代碼,然後調用新的exec()函數。
Notes
Python 2
Python 3
7)輸入函數改變了,刪除了raw_input,用input代替: Python 2有兩個全局函數,用來在命令行請求用戶輸入。第一個叫做input(),它等待用戶輸入一個Python表達式(然後返回結果)。第二個叫做raw_input(),用戶輸入什麼它就返回什麼。這讓初學者非常困惑,並且這被廣泛地看作是Python語言的一個「肉贅」(wart)。Python 3通過重命名raw_input()為input(),從而切掉了這個肉贅,所以現在的input()就像每個人最初期待的那樣工作。
2.X:guess = int(raw_input('Enter an integer : ')) # 讀取鍵盤輸入的方法
3.X:guess = int(input('Enter an integer : '))
Note:如果你真的想要請求用戶輸入一個Python表達式,計算結果,可以通過調用input()函數然後把返回值傳遞給eval()。
I/O方法xreadlines()
在Python 2里,文件對象有一個xreadlines()方法,它返回一個迭代器,一次讀取文件的一行。這在for循環中尤其有用。事實上,後來的Python 2版本給文件對象本身添加了這樣的功能。
在Python 3里,xreadlines()方法不再可用了。2to3可以解決簡單的情況,但是一些邊緣案例則需要人工介入。
Notes
Python 2
Python 3
①
②
8)改變了順序操作符的行為,例如x<y,當x和y類型不匹配時拋出TypeError而不是返回隨即的 bool值
9)去除元組參數解包。不能def(a, (b, c)):pass這樣定義函數了
10)新式的8進制字變數,相應地修改了oct()函數。
2.X的方式如下:
>>> 0666
438
>>> oct(438)
'0666'
3.X這樣:
>>> 0666
SyntaxError: invalid token (<pyshell#63>, line 1)
>>> 0o666
438
>>> oct(438)
'0o666'
11)增加了 2進制字面量和bin()函數
>>> bin(438)
'0b110110110'
>>> _438 = '0b110110110'
>>> _438
'0b110110110'
12)擴展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求兩點:rest是list對象和seq是可迭代的。
13)新的super(),可以不再給super()傳參數,
>>> class C(object):
def __init__(self, a):
print('C', a)
>>> class D(C):
def __init(self, a):
super().__init__(a) # 無參數調用super()
>>> D(8)
C 8
<__main__.D object at 0x00D7ED90>
14)支持class decorator。用法與函數decorator一樣:
>>> def foo(cls_a):
def print_func(self):
print('Hello, world!')
cls_a.print = print_func
return cls_a
>>> @foo
class C(object):
pass
>>> C().print()
Hello, world!
class decorator可以用來玩玩狸貓換太子的大把戲。更多請參閱PEP 3129
4. 字元串和位元組串
Python 2有兩種字元串類型:Unicode字元串和非Unicode字元串。Python 2有基於ASCII的str()類型,其可通過單獨的unicode()函數轉成unicode類型,但沒有byte類型。
而在Python 3中,終於有了Unicode(utf-8)字元串,以及兩個位元組類:bytes和bytearrays。Python 3隻有一種類型:Unicode字元串(Unicode strings)。只有str一種類型,但它跟2.x版本的unicode幾乎一樣。
Notes
Python 2
Python 3
①
②
全局函數unicode()
Python 2有兩個全局函數可以把對象強制轉換成字元串:unicode()把對象轉換成Unicode字元串,還有str()把對象轉換為非Unicode字元串。
Python 3隻有一種字元串類型,Unicode字元串,所以str()函數即可完成所有的功能。(unicode()函數在Python 3里不再存在了。)
Notes
Python 2
Python 3
5.數據類型
1)Python 2有為非浮點數准備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個最大值是平台相關的。可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數字范圍更大。
在Python 3里,只有一種整數類型int,大多數情況下,它很像Python 2里的長整型。
Note:檢查一個變數是否是整型,獲得它的數據類型,並與一個int類型(不是long)的作比較。你也可以使用isinstance()函數來檢查數據類型;再強調一次,使用int,而不是long,來檢查整數類型。
sys.maxint
由於長整型和整型被整合在一起了,sys.maxint常量不再精確。但是因為這個值對於檢測特定平台的能力還是有用處的,所以它被Python 3保留,並且重命名為sys.maxsize。
Notes
Python 2
Python 3
①
②
③ python3和Python2的區別
你應該是剛接觸Python吧,建議直接學Python3.x
下面是Python2.x與3.x版本區別:
Python的3.0版本,常被稱為Python 3000,或簡稱Py3k。相對於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 3.0或者程式本身使用了不支援Python 3.0的第三方庫。目前不支援Python 3.0的第三方庫有Twisted, py2exe, PIL等。
大多數第三方庫都正在努力地相容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫相容Python 3.0版本的程式,然後使用Python 2.6, Python 2.7來執行。
Python 3.0的變化主要在以下幾個方面:
1.print 函數
print語句沒有了,取而代之的是print()函數。 Python 2.6與Python 2.7部分地支持這種形式的print語法。在Python 2.6與Python 2.7裡面,以下三種形式是等價的:
print"fish"
print("fish")#注意print後面有個空格
print("fish")#print()不能帶有任何其它參數
然而,Python 2.6實際已經支持新的print()語法:
from__future__importprint_function
print("fish","panda",sep=',')
2.Unicode(這是一個極其好的改進)
Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型。
現在, 在 Python 3,我們最終有了 Unicode (utf-8) 字元串,以及一個位元組類:byte 和 bytearrays。
由於 Python3.X 源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:
>>>中國='china'
>>>print(中國)
china
Python 2.x
>>>str="我愛北京天安門"
>>>str
''
>>>str=u"我愛北京天安門"
>>>str
u''
Python 3.x
>>>str="我愛北京天安門"
>>>str
'我愛北京天安門'
3.除法運算
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
>>>-1//2
-1
python 3.x:
>>>-1//2
-1
注意的是並不是舍棄小數部分,而是執行floor操作,如果要截取小數部分,那麼需要使用math模塊的trunc函數
python 3.x:
>>>importmath
>>>math.trunc(1/2)
0
>>>math.trunc(-1/2)
0
4.異常
在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。
捕獲異常的語法由except exc, var改為except exc as var。
使用語法except (exc1, exc2) as var可以同時捕獲多種類別的異常。 Python 2.6已經支持這兩種語法。
1. 在2.x時代,所有類型的對象都是可以被直接拋出的,在3.x時代,只有繼承自BaseException的對象才可以被拋出。
2. 2.x raise語句使用逗號將拋出對象類型和參數分開,3.x取消了這種奇葩的寫法,直接調用構造函數拋出對象即可。
在2.x時代,異常在代碼中除了表示程序錯誤,還經常做一些普通控制結構應該做的事情,在3.x中可以看出,設計者讓異常變的更加專一,只有在錯誤發生的情況才能去用異常捕獲語句來處理。
5.xrange
在 Python 2 中 xrange() 創建迭代對象的用法是非常流行的。比如: for 循環或者是列表/集合/字典推導式。
這個表現十分像生成器(比如。"惰性求值")。但是這個 xrange-iterable 是無窮的,意味著你可以無限遍歷。
由於它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(比如 for 循環)。盡管如此,對比迭代一次,不建議你重復迭代多次,因為生成器每次都從頭開始。
在 Python 3 中,range() 是像 xrange() 那樣實現以至於一個專門的 xrange() 函數都不再存在(在 Python 3 中 xrange() 會拋出命名異常)。
importtimeit
n=10000
deftest_range(n):
returnforiinrange(n):
pass
deftest_xrange(n):
foriinxrange(n):
pass
Python 2
print'Python',python_version()
print' timingrange()'
%timeittest_range(n)
print' timingxrange()'
%timeittest_xrange(n)
Python2.7.6
timingrange()
1000loops,bestof3:433µsperloop
timingxrange()
1000loops,bestof3:350µsperloop
Python 3
print('Python',python_version())
print(' timingrange()')
%timeittest_range(n)
Python3.4.1
timingrange()
1000loops,bestof3:520µsperloop
print(xrange(10))
---------------------------------------------------------------------------
NameErrorTraceback(mostrecentcalllast)
<ipython-input-5-5d8f9b79ea70>in<mole>()
---->1print(xrange(10))
NameError:name'xrange'isnotdefined
6.八進制字面量表示
八進制數必須寫成0o777,原來的形式0777不能用了;二進制必須寫成0b111。
新增了一個bin()函數用於將一個整數轉換成二進制字串。 Python 2.6已經支持這兩種語法。
在Python 3.x中,表示八進制字面量的方式只有一種,就是0o1000。
python 2.x
>>>0o1000
512
>>>01000
512
python 3.x
>>>01000
File"<stdin>",line1
01000
^
SyntaxError:invalidtoken
>>>0o1000
512
7.不等運算符
Python 2.x中不等於有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法,還好,我從來沒有使用<>的習慣
8.去掉了repr表達式``
Python 2.x 中反引號``相當於repr函數的作用
Python 3.x 中去掉了``這種寫法,只允許使用repr函數,這樣做的目的是為了使代碼看上去更清晰么?不過我感覺用repr的機會很少,一般只在debug的時候才用,多數時候還是用str函數來用字元串描述對象。
defsendMail(from_:str,to:str,title:str,body:str)->bool:
pass
9.多個模塊被改名(根據PEP8)
>>>s=b.decode()
>>>s
'china'
>>>b1=s.encode()
>>>b1
b'china'
3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函數都被廢棄。同時去掉的還有 dict.has_key(),用 in替代它吧 。
④ python2和python3的區別
簡單的說,2是舊3是新,3是2的升級版,3完全高於2,2是時代的眼淚3是現在和未來,2逐漸被淘汰3用的人越來越多。
之前兩個版本共存只是因為諸多package的更新換代並沒有跟上,但是到了現在只要還有活人維護的package基本都兼容3了,然而新建的package卻越來越多不兼容2。使用2的意義基本沒有了,日常用3大不了留一個2備用就行。
⑤ python2.7.3和3.3.2的區別
轉自:http://my.oschina.net/chihz/blog/123437
這邊只說明面向對象方面的,其他方面見上面鏈接
面向對象
(1) 經典類和新式類
Python OO最神奇的地方就是有兩種類,經典類和新式類。
新式類跟經典類的差別主要是以下幾點:
1. 新式類對象可以直接通過__class__屬性獲取自身類型:type
2. 繼承搜索的順序發生了改變,經典類多繼承屬性搜索順序: 先深入繼承樹左側,再返回,開始找右側;新式類多繼承屬性搜索順序: 先水平搜索,然後再向上移動
3. 新式類增加了__slots__內置屬性, 可以把實例屬性的種類鎖定到__slots__規定的范圍之中。
4. 新式類增加了__getattribute__方法
Python 2.x中默認都是經典類,只有顯式繼承了object才是新式類
Python 3.x中默認都是新式類,不必顯式的繼承object
python 2.x:
>>> ClassicClass.__class__
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
AttributeError: class ClassicClass has no attribute '__class__'
>>> class NewClass(object):
... pass
...
>>> NewClass.__class__
python 3.x:
>>> class NewClass:pass
...
>>> NewClass.__class__
<class 'type'>
(2) 無綁定方法
在Python 2.x中除了類方法和靜態方法,其餘的方法都必須在第一個參數傳遞self跟實例綁定,但是在Python 3.x中廢除了這條規定,允許方法不綁定實例,這樣的方法跟普通的函數沒有區別:
Python 2.x:
>>> class MyClass:
... def function():
... print "function"
...
>>> MyClass.function()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: unbound method function() must be called with MyClass instance as first argument (got nothing instead)
>>> m = MyClass()
>>> m.function()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: function() takes no arguments (1 given)
Python 3.x:
>>> class MyClass:
... def function():
... print("function")
...
>>> MyClass.function()
function
>>> m = MyClass()
>>> m.function()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: function() takes no arguments (1 given)
(3) 重要的重載
1. next()和__next__():這應該是繼print之後第二大坑爹的不兼容吧,Python程序漫山遍野都是迭代器,但是2和3之間迭代器的實現介面方法名是不同的……嗯,啥都不說了。
2. 分片攔截:Python 3.x之前, 類可以定義__getslice__和__setslice__方法來專門攔截分片,並且這兩個方法優先於__getitem__和__setitem__, 但是Python 3.x時代這倆方法再也不存在了,全部的工作都交給了__getitem__和__setitem__,因此在使用這兩個方法之前要先判斷傳遞進參數的類型是不是slice對象。
3. __bool__方法:我們知道Python中默認將所有的空對象定義為布爾意義上的False,在自己定義的類中我們也可以加入自定義的布爾判斷標准,在2.x中這個方法名叫做__nonzero__, 這個名字顯然非常不直觀並且不科學!所有考試交白卷的孩子我們都要否定他們的才能么?顯然不能!因此Python 3.x中這個方法被重名命為__bool__
4. 3.x 取消了用於大小比較的__cmp__方法,取而代之的是:__lt__、__gt__、__le__、__ge__、__eq__、__ne__,嗯,我感覺這個想法真是不能苟同……有誰能說服我給我洗腦讓我愛上這一堆__lt__、__gt__、__le__、__ge__、__eq__、__ne__么。。。
(4) 類修飾器
在我的上一篇博客中秀了一把函數裝飾器在表單驗證中的使用,http://my.oschina.net/chihz/blog/122897
在3.x的時代,類也有裝飾器了,這個裝飾器威力巨大,能把裝飾的類搞的面目全非,總之想怎麼搞就怎麼搞,用法同函數裝飾器基本一致,只不過傳遞的參數是類型:
>>> def shutdown(cls):
... def shutdown_func(self):
... print("do something...")
... cls.shutdown = shutdown_func
... return cls
...
>>> @shutdown
... class Test:pass
...
>>> t = Test()
>>> t.shutdown()
do something...
異常
先來看一段代碼
python 2.x:
>>> class Person:
... def __init__(self, msg):
... self.msg = msg
...
>>> try:
... raise Person, "woca"
... except Person as p:
... print p.msg
...
woca
python 3.x:
>>> class Person:
... def __init__(self, msg):
... self.msg = msg
...
>>> try:
... raise Person("woca")
... except Person as p:
... print(p.msg)
Traceback (most recent call last):
File "<stdin>", line 2, in <mole>
TypeError: exceptions must derive from BaseException
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 3, in <mole>
TypeError: catching classes that do not inherit from BaseException is not allowed
>>>
接下來說不同:
1. 在2.x時代,所有類型的對象都是可以被直接拋出的,在3.x時代,只有繼承自BaseException的對象才可以被拋出。
2. 2.x raise語句使用逗號將拋出對象類型和參數分開,3.x取消了這種奇葩的寫法,直接調用構造函數拋出對象即可。
在2.x時代,異常在代碼中除了表示程序錯誤,還經常做一些普通控制結構應該做的事情,在3.x中可以看出,設計者讓異常變的更加專一,只有在錯誤發生的情況才能去用異常捕獲語句來處理。
⑥ Python 2 和 Python 3 有哪些主要區別
> 1. print不再是語句,而是函數,比如原來是 print 'abc' 現在是 print('abc')
但是 python2.6+ 可以使用 from __future__ import print_function 來實現相同功能
> 2. 在Python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class Foobar(object): pass 顯式地子類化object
但是最好還是加上. 主要區別在於 old-style 是 classtype 類型而 new-style 是 type類型
> 3. 原來1/2(兩個整數相除)結果是0,現在是0.5了
python 2.2+ 以上都可以使用 from __future__ import division 實現改特性, 同時注意 // 取代了之前的 / 運算
> 4. 新的字元串格式化方法format取代%
錯誤, 從 python2.6+ 開始已經在str和unicode中有該方法, 同時 python3依然支持 % 算符
> 6. xrange重命名為range
同時更改的還有一系列內置函數及方法, 都返回迭代器對象, 而不是列表或者 元組, 比如 filter, map, dict.items 等
> 7. !=取代 < >
python2 也很少有人用 < > 所以不算什麼修改
> 8. long重命名為int
不完全對, python3 徹底廢棄了 long+int 雙整數實現的方法, 統一為 int , 支持高精度整數運算.
> 9. except Exception, e變成except (Exception) as e
只有 python2.5 及以下版本不支持該語法. python2.6 是支持的. 不算新東西
> 10. exec變成函數
類似 print() 的變化, 之前是語句.
簡單補充下
* 主要是類庫的變化, 組織結構變了些. 但功能沒變. urlparse - > urllib.parse 這樣的變化
* 最核心的變化它沒有說, 對 bytes 和 原生 UNICODE 字元串的支持, 刪除了 unicode 對象, str 為原生 unicode 字元串, bytes 替代了之前的 str 這個是最核心的.
* 其它... 貌似不怎麼重要了.