Python進階之路---1.2python版本差別

                        Python2.*與python3.*版本差別

    做爲一個初學者,咱們應該如何選擇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:
Statically Nested Scopes

generators

2.2.0a1

2.3

PEP 255:
Simple Generators

division

2.2.0a2

3.0

PEP 238:
Changing the Division Operator

absolute_import

2.5.0a1

3.0

PEP 328:
Imports: Multi-Line and Absolute/Relative

with_statement

2.5.0a1

2.6

PEP 343:
The "with" Statement

print_function

2.6.0a2

3.0

PEP 3105:
Make print a function

unicode_literals

2.6.0a2

3.0

PEP 3112:
Bytes literals in Python 3000

     
    from platform import python_version 

print函數

雖然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
 

 

 

unicode

    Python 2有基於ASCIIstr()類型,其可經過單獨的unicode()函數轉成unicode類型,但沒有byte類型。

而在Python 3中,終於有了Unicodeutf-8)字符串,以及兩個字節類:bytesbytearrays

    Python2

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

 

    Python3

 
  
print(' has', type(b' bytes for storing data'))

has <class 'bytes'>

print(' also has', type(bytearray(b'bytearrays')))

also has <class 'bytearray'>
 

xrange

在 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中去掉了<>, 只有!=一種寫法。

去掉了repr表達式``

Python 2.x 中反引號``至關於repr函數的做用

Python 3.x 中去掉了``這種寫法,只容許使用repr函數,這樣作的目的是爲了使代碼看上去更清晰麼?不過我感受用repr的機會不多,通常只在debug的時候才用,多數時候仍是用str函數來用字符串描述對象。

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass

多個模塊被更名(根據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()函數。

數據類型

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

相關文章
相關標籤/搜索