Python 2和 3版本的一些區別__Python

來源:互聯網
上載者:User

     最近在學習python,和很多初學者一樣,一開始比較糾結到底是版本2好還是版本3是將來的趨勢呢。為了避免走太多彎路,專門上網查了相關資料,總結了一些2和3 的區別,很多內容是轉載來的,大神們別鄙視哈。。。

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可以直接指派外圍(非全域)變數 


4、print函數

雖然print文法是Python 3中一個很小的改動,且應該已經廣為人知,但依然值得提一下:Python 2中的print語句被Python 3中的print()函數取代,這意味著在Python 3中必須用括弧將需要輸出的對象括起來。

在Python 2中使用額外的括弧也是可以的。但反過來在Python 3中想以Python2的形式不帶括弧調用print函數時,會觸發SyntaxError。

Python 2

print 'Python', python_version()

print 'Hello, World!'

print('Hello, World!')

print "text", ; print 'print more texton the same line'

Python 2.7.6

Hello, World!

Hello, World!

text print more text on the same line

Python 3

print('Python', python_version())

print('Hello, World!')

 

print("some text,", end="")

print(' print more text on the same line')

Python 3.4.1

Hello, World!

some text, print more text on the same line

print 'Hello, World!'

File "<ipython-input-3-139a7c5835bd>", line 1

print 'Hello, World!'

^

SyntaxError: invalid syntax

注意:

在Python中,帶不帶括弧輸出”Hello World”都很正常。但如果在圓括弧中同時輸出多個對象時,就會建立一個元組,這是因為在Python 2中,print是一個語句,而不是函數調用。

print 'Python', python_version()

print('a', 'b')

print 'a', 'b'

Python 2.7.7

('a', 'b')

a b

5、整數除法

由於人們常常會忽視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的除法)。

Python 2

print 'Python', python_version()

print '3 / 2 =', 3 / 2

print '3 // 2 =', 3 // 2

print '3 / 2.0 =', 3 / 2.0

print '3 // 2.0 =', 3 // 2.0

Python 2.7.6

3 / 2 = 1

3 // 2 = 1

3 / 2.0 = 1.5

3 // 2.0 = 1.0

Python 3

print('Python', python_version())

print('3 / 2 =', 3 / 2)

print('3 // 2 =', 3 // 2)

print('3 / 2.0 =', 3 / 2.0)

print('3 // 2.0 =', 3 // 2.0)

Python 3.4.1

3 / 2 = 1.5

3 // 2 = 1

3 / 2.0 = 1.5

3 // 2.0 = 1.0

6、xrange

在Python 2.x中,經常會用xrange()建立一個可迭代對象,通常出現在“for迴圈”或“列表/集合/字典推導式”中。

這種行為與產生器非常相似(如”惰性求值“),但這裡的xrange-iterable無盡的,意味著可能在這個xrange上無限迭代。

由於xrange的“惰性求知“特性,如果只需迭代一次(如for迴圈中),range()通常比xrange()快一些。不過不建議在多次迭代中使用range(),因為range()每次都會在記憶體中重建一個列表。

在Python 3中,range()的實現方式與xrange()函數相同,所以就不存在專用的xrange()(在Python 3中使用xrange()會觸發NameError)。

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

Python 2

print 'Python', python_version()

 

print 'ntiming range()'

%timeit test_range(n)

 

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

Python 3

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)

in ()

----> 1 print(xrange(10))

 

NameError: name 'xrange' is not defined


附知乎大神的回覆

作者:王貓貓
連結:http://www.zhihu.com/question/19698598/answer/12704353
來源:知乎

> 1. print不再是語句,而是函數,比如原來是 print 'abc' 現在是 print('abc')
但是 python2.6+ 可以使用 from __future__ import print_function 來實現相同功能
> 2. 在Python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class Foobar(object): pass 顯式地子類化object
但是最好還是加上. 主要區別在於 old-style 是 classtype 類型而 new-style 是 type類型
> 3. 原來1/2(兩個整數相除)結果是0,現在是0.5了
python 2.2+ 以上都可以使用 from __future__ import division 實現改特性, 同時注意 // 取代了之前的 / 運算
> 4. 新的字串格式化方法format取代%
錯誤, 從 python2.6+ 開始已經在str和unicode中有該方法, 同時 python3依然支援 % 算符
> 6. xrange重新命名為range
同時更改的還有一系列內建函數及方法, 都返回迭代器對象, 而不是列表或者 元組, 比如 filter, map, dict.items 等
> 7. !=取代 < > 
python2 也很少有人用 < > 所以不算什麼修改
> 8. long重新命名為int
不完全對, python3 徹底廢棄了 long+int 雙整數實現的方法, 統一為 int , 支援高精度整數運算.
> 9. except Exception, e變成except (Exception) as e
只有 python2.5 及以下版本不支援該文法. python2.6 是支援的. 不算新東西
> 10. exec變成函數
類似 print() 的變化, 之前是語句.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.