做爲一個初學者,咱們應該如何選擇python的版本進行學習呢,這兩個版本有什麼區別呢,接下來讓咱們簡單瞭解一下,以便咱們後續的學習。python
Python版本差別簡介 cookie
使用_future_模塊 socket
Print函數 函數
整數除法 oop
Unicode 學習
Xrange this
觸發異常 spa
處理異常 .net
next()函數和.net()方法 debug
for循環變量與全局命名空間泄露
比較無序類型
使用input()解析輸入內容
返回可迭代對象,而不是列表
使用_future_模塊
Python 3.x引入了一些與Python 2不兼容的關鍵字和特性,在Python 2中,能夠經過內置的__future__模塊導入這些新內容。若是你但願在Python 2環境下寫的代碼也能夠在Python 3.x中運行,那麼建議使用__future__模塊。例如,若是但願在Python 2中擁有Python 3.x的整數除法行爲,能夠經過下面的語句導入相應的模塊。
from __future__ import division
下表列出了__future__中其餘可導入的特性:
特性 |
可選版本 |
強制版本 |
效果 |
nested_scopes |
2.1.0b1 |
2.2 |
PEP 227: |
generators |
2.2.0a1 |
2.3 |
PEP 255: |
division |
2.2.0a2 |
3.0 |
PEP 238: |
absolute_import |
2.5.0a1 |
3.0 |
PEP 328: |
with_statement |
2.5.0a1 |
2.6 |
PEP 343: |
print_function |
2.6.0a2 |
3.0 |
PEP 3105: |
unicode_literals |
2.6.0a2 |
3.0 |
PEP 3112: |
from platform import python_version
雖然print語法是Python 3中一個很小的改動,且應該已經廣爲人知,但依然值得提一下:Python 2中的print語句被Python 3中的print()函數取代,這意味着在Python 3中必須用括號將須要輸出的對象括起來。
在Python 2中使用額外的括號也是能夠的。但反過來在Python 3中想以Python2的形式不帶括號調用print函數時,會觸發SyntaxError。
Python2
print "hello word"
Python3
print('Hello, World!') print("some text,", end="") print(' print more text on the same line')
注意:
在Python中,帶不帶括號輸出"Hello World"都很正常。但若是在圓括號中同時輸出多個對象時,就會建立一個元組,這是由於在Python 2中,print是一個語句,而不是函數調用。
因爲人們經常會忽視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的除法)。
Python2
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 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0
Python3
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.5 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0
Python 2有基於ASCII的str()類型,其可經過單獨的unicode()函數轉成unicode類型,但沒有byte類型。
而在Python 3中,終於有了Unicode(utf-8)字符串,以及兩個字節類:bytes和bytearrays。
print type(unicode('this is like a python3 str type')) <type 'unicode'> print type(b'byte type does not exist') <type 'str'> print 'they are really' + b' the same' they are really the same print type(bytearray(b'bytearray oddly does exist though')) <type 'bytearray'>
print(' has', type(b' bytes for storing data')) has <class 'bytes'> print(' also has', type(bytearray(b'bytearrays'))) also has <class 'bytearray'>
在 Python 2 中 xrange() 建立迭代對象的用法是很是流行的。好比: for 循環或者是列表/集合/字典推導式。這個表現十分像生成器(好比。"惰性求值")。可是這個 xrange-iterable 是無窮的,意味着你能夠無限遍歷。因爲它的惰性求值,若是你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(好比 for 循環)。儘管如此,對比迭代一次,不建議你重複迭代屢次,由於生成器每次都從頭開始。
在 Python 3 中,range() 是像 xrange() 那樣實現以致於一個專門的 xrange() 函數都再也不存在(在 Python 3 中 xrange() 會拋出命名異常)。
import timeit n = 10000 def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass
python2
print 'Python', python_version() print '\ntiming range()' %timeit test_range(n) print '\n\ntiming xrange()' %timeit test_xrange(n) Python 2.7.6 timing range() 1000 loops, best of 3: 433 µs per loop timing xrange() 1000 loops, best of 3: 350 µs per loop
python3
print('Python', python_version()) print('\ntiming range()') %timeit test_range(n) Python 3.4.1 timing range() 1000 loops, best of 3: 520 µs per loop
print(xrange(10)) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-5-5d8f9b79ea70> in <module>() ----> 1 print(xrange(10)) NameError: name 'xrange' is not defined
八進制數必須寫成0o777,原來的形式0777不能用了;二進制必須寫成0b111。
新增了一個bin()函數用於將一個整數轉換成二進制字串。 Python 2.6已經支持這兩種語法。
在Python 3.x中,表示八進制字面量的方式只有一種,就是0o1000。
python 2x
>>> 0o1000
512
>>> 01000
512
python 3x
>>> 01000 File "<stdin>", line 1 01000 ^ SyntaxError: invalid token >>> 0o1000 512
Python 2.x中不等於有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法。
Python 2.x 中反引號``至關於repr函數的做用
Python 3.x 中去掉了``這種寫法,只容許使用repr函數,這樣作的目的是爲了使代碼看上去更清晰麼?不過我感受用repr的機會不多,通常只在debug的時候才用,多數時候仍是用str函數來用字符串描述對象。
def sendMail(from_: str, to: str, title: str, body: str) -> bool: pass
舊的名字 | 新的名字 |
---|---|
_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()函數。
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替代它吧 。