Luôn luôn có tranh luận trong cộng đồng lập trình về phiên bản Python nào tốt nhất để học: Python 2.x hay Python 3.x.
Dưới đây là những khác biệt chính giữa Python 2.x và Python 3.x:
1. Hàm print
Trong Python 2.x, "print" được coi là một câu lệnh (statement) và Python 3.x rõ ràng coi "print" như một hàm (function). Điều này có nghĩa là chúng ta cần truyền các mục bên trong print vào ngoặc đơn theo cách tiêu chuẩn, nếu không bạn sẽ gặp lỗi cú pháp.
# Python 2.7
print 'Python', python_version()
print 'Hello, World!'
print('Hello, World!')
print "text", ; print 'some more text here'
Kết quả
Python 2.7.6
Hello, World!
Hello, World!
text print some more text here
# Python 3
import sys
print("Python version is %s.%s.%s" % sys.version_info[:3])
print('Hello, World!')
print("some text,", end="")
print('some more text here')
Kết quả
Python version is 3.6.1
Hello, World!
some text,some more text here
>>> print "Hello"
Syntax Error: Missing parentheses in call to 'print'
2. Chia số nguyên (Integer division)
Python 2 coi các số bạn nhập không có chữ số sau dấu thập phân là số nguyên, điều này có thể dẫn đến kết quả bất ngờ khi chia. Ví dụ, nếu bạn gõ biểu thức 3 / 2 trong code Python 2, kết quả sẽ là 1, không phải 1.5 như bạn mong đợi. Khuyến nghị dùng float(x) thay vì chỉ dùng x trong code Python 3 (trường hợp codebase port sang Python 2) hoặc dùng from __future__ import division trong script Python 2.
# 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
Kết quả
Python 2.7.6
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0
# Python 3.6.1
import sys
print('Python %s.%s.%s' % sys.version_info[:3])
print('3 / 2 =', 3 / 2)
print('3 // 2 =', 3 // 2)
print('3 / 2.0 =', 3 / 2.0)
print('3 // 2.0 =', 3 // 2.0)
Kết quả
Python 3.6.1
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0
3. Chuỗi Unicode (Unicode Strings)
Mặc định, Python 3 lưu chuỗi dưới dạng Unicode trong khi Python 2 yêu cầu bạn đánh dấu chuỗi bằng "u" nếu muốn lưu dưới dạng Unicode. Chuỗi Unicode linh hoạt hơn chuỗi ASCII (mặc định của Python 2), vì chúng có thể lưu chữ cái từ ngôn ngữ nước ngoài cũng như emoji và các chữ cái La Mã tiêu chuẩn.
# Python 2
>>> print type(unicode('this is like a python3 str type'))
>>> print type(b'byte type does not exist')
>>> print 'they are really' + b' the same'
they are really the same
# Python 3
import sys
print('Python %s.%s.%s' % sys.version_info[:3])
print('strings are now utf-8 \u03BCnico\u0394é!')
print('Python %s.%s.%s' % sys.version_info[:3], end="")
print(' has', type(b' bytes for storing data'))
print('Python %s.%s.%s' % sys.version_info[:3], end="")
print(' also has', type(bytearray(b'bytearrays')))
Kết quả
Python 3.6.1
strings are now utf-8 μnicoΔé!
Python 3.6.1 has
Python 3.6.1 also has
"string" + b"bytes of data" sẽ ném lỗi.
>>> print('they are really' + b' the same')
Traceback (most recent call last):
File "", line 1, in
print('they are really' + b' the same')
TypeError: must be str, not bytes
4. Ném ngoại lệ (Raising Exception)
Python 3 yêu cầu cú pháp khác để ném ngoại lệ. Nếu bạn muốn xuất thông báo lỗi cho người dùng, bạn cần dùng cú pháp:
raise IOError("your error message")
Cú pháp trên hoạt động trên cả Python 2 và Python 3.
Tuy nhiên, code sau chỉ hoạt động trong Python 2, không hoạt động trong Python 3:
raise IOError, "your error message"
5. Biến vòng lặp List Comprehension
Trong Python 2, đặt tên biến được lặp trong "for loop" trùng tên với biến toàn cục có thể dẫn đến giá trị biến toàn cục bị thay đổi – điều chúng ta thường không muốn. Vấn đề này đã được sửa trong Python 3, vì vậy bạn có thể dùng tên biến đã dùng cho biến điều khiển trong "for loop" mà không lo nó rò rỉ ra và làm rối giá trị biến trong phần còn lại của code.
# Python 2
print 'Python', python_version()
i = 1
print 'before: i =', i
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i
Kết quả
Python 2.7.6
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 4
# Python 3
import sys
print('Python %s.%s.%s' % sys.version_info[:3])
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)
Kết quả
Python 3.6.1
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 1