最近在學習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() 的變化, 之前是語句.