国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python2.x與Python3.x的區別

2020-01-04 17:51:02
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python2.x與Python3.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來執行。

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() 
3)關鍵詞加入as 和with,還有True,False,None 
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<y,當x和y類型不匹配時拋出TypeError而不是返回隨即的 bool值 
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 (<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)新的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) 
<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替代它吧

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 
Mapping 
MappingView 
MutableMapping 
MutableSequence 
MutableSet 
NamedTuple 
Sequence 
Set 
Sized

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模塊(單獨發布,可以從http://www.jcea.es/programacion/pybsddb.htm獲取) 
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' ‘)來達到相同目的 

3)zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload 
()函數都被去除了現在可以使用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 
<type 'file'> 

在Py3.X中: 

>>> file 
Traceback (most recent call last): 
File "<pyshell#120>", line 1, in <module> 
file 
NameError: name 'file' is not defined 

python2.x與python3.x在除法運算上的區別

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:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0

以上內容給大家介紹了Python2.x與Python3.x的區別,希望對大家有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西吉县| 沙雅县| 江永县| 施秉县| 嵩明县| 枣阳市| 苍溪县| 加查县| 广平县| 石河子市| 康乐县| 乳源| 贵定县| 邛崃市| 高要市| 郓城县| 石楼县| 东莞市| 额敏县| 九江县| 佛山市| 蒙山县| 白玉县| 宁安市| 宿松县| 冕宁县| 洛阳市| 老河口市| 万盛区| 南华县| 夏津县| 江山市| 怀仁县| 德昌县| 林甸县| 漳平市| 余干县| 青阳县| 巴彦淖尔市| 乐亭县| 勐海县|