python 3.x 與2.x的區別


前言

  保持學習的態度,學一門動態語言其實是很早以前的就准備要做的事情,當時還在糾結python與ruby。現在不單單是要學python,還在考慮用它做點什么,這些等后續再說吧,因為看的是python2.x的書籍。用的是python 3.7.所以先把兩者的區別記錄一下,僅限於基礎。

python3.x 與2.x的區別

1.print

print語句沒有了,取而代之的是print()函數。

py 2.x:

print "wyl" #語句
print("wyl") 

py 3.x:

>> print("wyl")
wyl
>>> print 'wyl'
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('wyl')?

2.Unicode

Python 2 有 ASCII str() 類型,unicode() 是單獨的,不是 byte 類型。

現在, 在 Python 3,我們最終有了 Unicode (utf-8) 字符串,以及一個字節類:byte 和 bytearrays。

由於 Python3.X 源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:

py 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'

py 3.x

>>> str='王延領那小子真帥'
>>> str
'王延領那小子真帥'
>>> 

 3.除法運算 

Python中的除法有兩個運算符,/和//

首先來說/除法:

在python 2.x中/除法就跟我們熟悉的大多數語言,比如Java啊C#啊差不多,取整,把小數部分完全忽略掉。

在python 3.x中/除法不再這么做了,對於整數之間的相除,結果也會是浮點數。

py 2.x

>>> 1/2
0
>>> 

py 3.x

>>> 1/2
0.5
>>>

第二種//除法:

這種除法叫做floor除法,py2.x與py3.x相同

 py2.x py3.x

>>> 1//2
0
>>> 

4.異常

在 py3.x 中我們現在使用 as 作為關鍵詞,而非‘,’

所以異常都從 BaseException繼承,並刪除了StardardError 

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

用 raise Exception(args)代替 raise Exception, args語法 

捕獲異常的語法改變,引入了as關鍵字來標識異常實例

py3.0:

>>> try:
  1/0
except Exception , err:
  print err
  
SyntaxError: invalid syntax
>>> 
#正確的寫法
>>> try:
  1/0
except Exception as err:
  print(err)

  
division by zero
>>> 

5.xrange

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

py 2.x

>>> range(1,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

py3.x

>>> range(10)
range(0, 10)
>>> 

py3.x 如果想使用range(),可以結合list

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 

 6.八進制

python 八進制不能0開頭而是以0o開頭

py 3.x

>>> 0101
SyntaxError: invalid token
>>> 0o101
65
>>> 

7.不等運算符

不等運算py3.x只有“!=”,“<>”已被移除

py3.x

>>> 1!=3
True
>>> 1<>3
SyntaxError: invalid syntax
>>> 

8.去掉了repr表達式``

py3.x

>>> s=`wyl`
SyntaxError: invalid syntax
>>> s='wyl'
>>> repr(s)
"'wyl'"

9.多個模塊被改名(根據PEP8)

舊的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib

 

 

 

 

 

 

 

StringIO模塊現在被合並到新的io模組內。 new, md5, gopherlib等模塊被刪除。

Python 2.6已經支援新的io模組。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合並到http包內。

取消了exec語句,只剩下exec()函數。 Python 2.6已經支援exec()函數。

10.數據類型

py 3.x

1>去掉了long

2>新增了bytes類型,對應於2.X版本的八位串

3>dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函數都被廢棄。同時去掉的還有 dict.has_key(),用 in替代它吧 。

11.面向對象

1>引入抽象基類(Abstraact Base Classes,ABCs)

2>容器類和迭代器類被ABCs化,所以cellections模塊里的類型比Py2.x多了很多

>>> import collections
>>> print('\n'.join(dir(collections)))
AsyncGenerator
AsyncIterable
AsyncIterator
Awaitable
ByteString
Callable
ChainMap
Collection
Container
Coroutine
Counter
Generator
Hashable
ItemsView
Iterable
Iterator
KeysView
Mapping
MappingView
MutableMapping
MutableSequence
MutableSet
OrderedDict
Reversible
Sequence
Set
Sized
UserDict
UserList
UserString
ValuesView
_Link
_OrderedDictItemsView
_OrderedDictKeysView
_OrderedDictValuesView
__all__
__builtins__
__cached__
__doc__
__file__
__loader__
__name__
__package__
__path__
__spec__
_chain
_collections_abc
_count_elements
_eq
_heapq
_iskeyword
_itemgetter
_nt_itemgetters
_proxy
_recursive_repr
_repeat
_starmap
_sys
abc
defaultdict
deque
namedtuple
>>> 
View Code

3>迭代器的next()方法改名為__next__(),並增加內置函數next(),用以調用迭代器的__next__()方法 

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

12.模塊

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() 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM