詳解python2和python3的區別

2021-06-28 17:42:37 字數 5595 閱讀 2222

1樓:匿名使用者

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)去除了<>,全部改用!=

2)去除``,全部改用repr()

4)整型除法返回浮點數,要得到整型結果,請使用//

5)加入nonlocal語句。使用noclocal x可以直接指派外圍(非全域性)變數

6)去除print語句,加入print()函式實現相同的功能。同樣的還有 exec語句,已經改為exec()函式

例如: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=" ")                     # 使用空格代替換行

2.x: print                                 # 輸出新行

3.x: print()                               # 輸出新行

2.x: print >>sys.stderr, "fatal error"

3.x: print("fatal error", file=sys.stderr)

2.x: print (x, y)                          # 輸出repr((x, y))

3.x: print((x, y))                         # 不同於print(x, y)!

7)改變了順序操作符的行為,例如x

8)輸入函式改變了,刪除了raw_input,用input代替:

2.x:guess = int(raw_input('enter an integer : ')) # 讀取鍵盤輸入的方法

3.x:guess = int(input('enter an integer : '))

9)去除元組引數解包。不能def(a, (b, c)):pass這樣定義函式了

10)新式的8進位制字變數,相應地修改了oct()函式。

2.x的方式如下:

>>> 0666

438>>> oct(438)

'0666'

3.x這樣:

>>> 0666

syntaxerror: invalid token (, 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)新的metaclass語法:

class foo(*bases, **kwds):

pass

15)支援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. 字串和位元組串

1)現在字串只有str一種型別,但它跟2.x版本的unicode幾乎一樣。

2)關於位元組串,請參閱“資料型別”的第2條目

5.資料型別

1)py3.x去除了long型別,現在只有一種整型——int,但它的行為就像2.x版本的long

2)新增了bytes型別,對應於2.x版本的八位串,定義一個bytes字面量的方法如下:

>>> b = b'china'

>>> type(b)

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替代它吧

6.物件導向

1)引入抽象基類(abstraact base classes,abcs)。

2)容器類和迭代器類被abcs化,所以cellections模組裡的型別比py2.5多了很多。

>>> import collections

>>> print('\n'.join(dir(collections)))

callable

container

hashable

itemsview

iterable

iterator

keysview

mutablesequence

mutableset

namedtuple

sequence

setsized

valuesview

__all__

__builtins__

__doc__

__file__

__name__

_abcoll

_itemgetter

_sys

defaultdict

deque

另外,數值型別也被abcs化。關於這兩點,請參閱 pep 3119和pep 3141。

3)迭代器的next()方法改名為__next__(),並增加內建函式next(),用以呼叫迭代器的__next__()方法

4)增加了@abstractmethod和 @abstractproperty兩個 decorator,編寫抽象方法(屬性)更加方便。

7.異常

1)所以異常都從 baseexception繼承,並刪除了stardarderror

2)去除了異常類的序列行為和.message屬性

3)用 raise exception(args)代替 raise exception, args語法

4)捕獲異常的語法改變,引入了as關鍵字來標識異常例項,在py2.5中:

>>> try:

...    raise notimplementederror('error')

... except notimplementederror, error:

...    print error.message

error

在py3.0中:

>>> try:

raise notimplementederror('error')

except notimplementederror as error: #注意這個 as

print(str(error))

error

5)異常鏈,因為__context__在3.0a1版本中沒有實現

8.模組變動

1)移除了cpickle模組,可以使用pickle模組代替。最終我們將會有一個透明高效的模組。

2)移除了imageop模組

3)移除了 audiodev, bastion, bsddb185, exceptions, linuxaudiodev, md5,

mimewriter, mimify, popen2,

rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模組

4)移除了bsddb模組

5)移除了new模組

6)os.tmpnam()和os.tmpfile()函式被移動到tmpfile模組下

7)tokenize模組現在使用bytes工作。主要的入口點不再是generate_tokens,而是

tokenize.tokenize()

9.其它

1)xrange() 改名為range(),要想使用range()獲得一個list,必須顯式呼叫:

>>> list(range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2)bytes物件不能hash,也不支援 b.lower()、b.strip()和b.split()方法,但對於後兩者可以使用 b.strip(b’

\n\t\r \f’)和b.split(b’ ‘)來達到相同目的

()函式都被去除了

現在可以使用hasattr()來替換 callable(). hasattr()的語法如:hasattr(string,

'__name__')

4)string.letters和相關的.lowercase和.uppercase被去除,請改用string.ascii_letters

等 5)如果x < y的不能比較,丟擲typeerror異常。2.x版本是返回偽隨機布林值的

6)__getslice__系列成員被廢棄。a[i:j]根據上下文轉換為a.__getitem__(slice(i, j))或

__setitem__和

__delitem__呼叫

7)file類被廢棄,在py2.5中:

>>> file

在py3.x中:

>>> file

traceback (most recent call last):

file "", line 1, in

file

nameerror: name 'file' is not defined

Python2和Python3都有什麼區別

1.print不再是語句,而是函式,比如原來是 print abc 現在是636f707962616964757a686964616f31333363383433 print abc 但是 python2.6 可以使用 from future import print function 來實現相同功...

Python 2和Python 3有哪些主要區別

print不再是語句,而是函式,比如原來是 print abc 現在是 print abc 但是 python2.6 可以使用 from future import print function 來實現相同功能 在python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class foob...

Python 2和Python 3有哪些主要區別

1.print不再是語句,而是函式,比如原來是 print abc 現在是 print abc 但是 python2.6 可以使用 from future import print function 來實現相同功能 2.在python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class ...