Các nhà phát triển ngôn ngữ Python đã đưa nhiều tính năng và gói Python 3 mới được giới thiệu trở lại vào Python 2. 6 và Trăn 2. 7. Tuy nhiên, các tính năng của Python 3 sẽ ảnh hưởng đến cú pháp ngôn ngữ Python 2 cốt lõi không được bật theo mặc định. Thay vào đó, chúng phải được kích hoạt rõ ràng bằng cách nhập chúng từ __future__ mô-đun giả. __future__ là mô-đun giả theo nghĩa nó không phải là mô-đun Python 2 thực, mà thay vào đó, nó giống như một lệnh tới mã byte của python . Đây là lý do tại sao tất cả các lần nhập __future__ phải được đặt ở đầu tệp python trước bất kỳ câu lệnh nhập thông thường nào khác. __future__ có nghĩa là để dễ dàng chuyển đổi sang cú pháp python mới hơn. Ngoài ra, nó cho phép chúng tôi duy trì một cơ sở mã nhất quán duy nhất sẽ chạy trên cả hai phiên bản Python.
Sự khác biệt chínhSự khác biệt chính giữa Python2 và Python 3 như được nêu dưới đây
Báo cáo in
Một trong những khác biệt cơ bản nhất giữa Python 2 và 3 là câu lệnh in. Trong Python 2, print là một câu lệnh đặc biệt được sử dụng để in các giá trị trên bàn điều khiển. Điều này có nghĩa là không cần dấu ngoặc đơn khi gọi câu lệnh in. Ngược lại, print là một hàm trong Python 3 và yêu cầu dấu ngoặc đơn khi nó được gọi
Có thể sử dụng chức năng in mới hơn trong Python 2 bằng cách nhập print_function từ mô-đun __future__.
con trăn1
2
3
4
5
6
7
8
9
10
11
12
13
$ python2
>>> in 1, 2, 3
123
>>> in[1, 2, 3] # Notice how [1, 2, 3] is treated as a tuple
[1, 2, 3]
>>> loại[print] # This raises a syntax error since print is not a function
Tệp ", dòng>> in 1, 2, 3
123
>>> in[1, 2, 3] # Notice how [1, 2, 3] is treated as a tuple
[1, 2, 3]
>>> loại[print] # This raises a syntax error since print is not a function
Tệp ", dòng>> 1 / 2
0. 5
>>> 1 // 2
0
$ python2
>>> 1 / 2
0
Gói __init__ tệp
Python xem xét các tệp nguồn python riêng lẻ [. py] dưới dạng mô-đun và các mô-đun này có thể được nhóm lại với nhau trong cấu trúc thư mục phân cấp để tạo gói [trong đó tên thư mục xác định tên gói]. Python cho phép các gói được lồng vào nhau bằng cách giữ các thư mục con bên trong thư mục gói mẹ. Cấu trúc thư mục của một gói ví dụ như hình bên dưới
con trăn1
2
3
4
5
gói_a
| -- __init__. py
| -- mô-đun 1. py
| -- mô-đun 2. py
Mã khởi tạo cho gói có thể được đặt bên trong __init__. py tệp. Một điểm khác biệt giữa Python 2 và Python 3 là __init__. py phải được xác định rõ ràng bên trong thư mục để Python 2 xử lý nội dung của thư mục dưới dạng gói. Điều này có nghĩa là Python 2 sẽ không nhận ra một thư mục là một gói trừ khi nó có __init__. py file bên trong nó. __init__ này. tệp py có thể trống, nhưng nó phải tồn tại bên trong thư mục một cách rõ ràng. Ngược lại, Python 3 không bắt buộc bất kỳ yêu cầu nào như vậy đối với sự hiện diện của __init__. py tệp. Nghĩa là, Python 3 sẽ coi bất kỳ thư mục nào là một gói bất kể thư mục đó có chứa __init__ hay không. py tệp.
nhập khẩu tuyệt đối
Các câu lệnh nhập chẳng hạn như mod nhập trong một gói không rõ ràng. Trong Python 2, chúng có thể tham chiếu đến một mô-đun khác có trong gói đó hoặc đến một mô-đun cấp cao nhất. Điều này có thể khiến các mô-đun thư viện tiêu chuẩn bị che khuất bởi các mô-đun bên trong gói có cùng tên. Để tránh sự mơ hồ này, Python 3 không cho phép nhập tương đối ngầm định và thay vào đó sử dụng nhập tuyệt đối để nhập gói mod đầu tiên được tìm thấy trong sys.path thư mục. Hành vi này có thể nhận được trong Python 2 bằng cách nhập absolute_import từ __future__ .
Để tiếp tục sử dụng nhập tương đối [nhập các mô-đun khác từ bên trong gói], Python 3 giới thiệu ký hiệu dấu chấm để xác định rõ ràng rằng chúng tôi muốn thực hiện nhập tương đối. Một dấu chấm đơn đề cập đến thư mục hiện tại và hai dấu chấm chỉ định thư mục mẹ. Ký hiệu dấu chấm có thể được sử dụng để nhập các mô-đun tương đối như hình bên dưới
con trăn1
2
3
từ . nhập mod # mod.py exists in the same directory
từ . gói phụ nhập another_mod >> str = 'hello world' # unicode string
>>> str_b = b'hello bytes' # bytes string
>>> loại[str_b]
>>> byte[str, 'utf-8'] # convert unicode to bytes
b'xin chào thế giới'
con trăn1
2
3
4
5
$ python2
>>> str = 'hello world' # bytes string
>>> unicode[str]
u'xin chào thế giới'
FuncCông cụ
Python 2 cung cấp các chức năng lập trình chức năng hữu ích như reduce theo mặc định trong không gian tên chung. Tuy nhiên, Python 3 chuyển các tiện ích lập trình chức năng như reduce vào functools .
con trăn1
2
3
4
5
6
7
$ python3
>>> nhập công cụ chức năng
>>> công cụ chức năng. giảm[lambda x, . y: x + y, phạm vi[5]]
$ python2
>>> giảm[lambda x,y: x + y, phạm vi[5]]
máy phát điện
Trong Python 3, phạm vi, bản đồ, zip, và bộ lọc functions return a generator that can be iterated to obtain the individual values. This is in contrast with Python 2 where the phạm vi, bản đồ, zip, và bộ lọc functions return a list containing all the elements.
Ghi chú. Python 2 cung cấp một phương thức xrange trả về một trình tạo cho phạm vi bắt buộc được chỉ định trong các tham số.
con trăn1
2
3
4
5
6
7
8
9
10
11
$ python3
>>> phạm vi[10]
phạm vi[0, 10]
$ python2
>>> phạm vi[5]
[0, 1, 2, 3, 4]
>>> xrange[5]
xrange[5]
ngoại lệ
Cú pháp tăng Ngoại lệ trong Python 3 được thay đổi một chút khi so sánh với Python 2. Thông báo ngoại lệ bây giờ phải được đặt trong ngoặc đơn. Ngoài ra, cú pháp xử lý ngoại lệ cũng đã được thay đổi vì bây giờ chúng ta phải sử dụng từ khóa as để nắm bắt ngoại lệ thành một biến.
con trăn1
2
3
4
5
6
7
8
9
10
11
12
$ python2
>>> thử.
.. . tăng Ngoại lệ, 'Điều gì đó . '
.. . ngoại trừ Ngoại lệ, ví dụ.
.. . in ex
$ python3
>>> thử.
.. . tăng Ngoại lệ['Cái gì đó . ']
.. . ngoại trừ Ngoại lệ như ví dụ.
.. . in[ex]>> s = 1000
>>> arr = [s*s for s in range[5]] # global s has been reassigned 4
>>> in[s]
4
$ python3
>>> s = 1000
>>> arr = [s*s for s in range[5]] # s is not leaked into global
>>> in[s]
1000
làm tròn
Trong Python 3, chiến lược làm tròn được sử dụng bởi hàm round đã được sửa đổi cho các trường hợp nửa chừng [giá trị thập phân của 0. 5]. Giá trị sẽ được làm tròn đến số chẵn gần nhất trong trường hợp giữa chừng. Điều này không giống như Python 2 đã sử dụng sơ đồ làm tròn của Banker trong đó tất cả các số ở giữa được làm tròn lên
con trăn1
2
3
4
5
6
7
8
$ python3
>>> vòng[10.2], vòng[ . 5], vòng[ . 9]
[10, 10, 11]
$ python2
>>> vòng[10.2], vòng[ . 5], vòng[ . 9]
[10. 0, 11. 0, 11. 0]
Phiên bản Độc lập với sáu
Gói six cho phép chúng tôi viết mã trong cả hai phiên bản python mà không cần sửa đổi gì. Six cung cấp các giao diện xoay quanh sự khác biệt giữa Python 2 và Python 3. Six cho phép chúng tôi kiểm tra phiên bản của trình thông dịch Python bằng hai cờ boolean six. PY2 và sáu. PY3 được đặt tùy thuộc vào phiên bản python hiện đang thực thi tập lệnh.
Sáu bao quanh những khác biệt cơ bản bằng cách sử dụng các hằng số như six. text_types cung cấp trình bao bọc xung quanh loại văn bản unicode trong python [str trong Python 3 và unicode in Python 2].
Sáu cũng bao quanh sự khác biệt của thư viện tiêu chuẩn bằng cách sử dụng sáu. di chuyển mô-đun phụ. sáu. di chuyển cung cấp các trình bao bọc xung quanh tất cả các chức năng thư viện tiêu chuẩn đã được sắp xếp lại trong Python 3 bằng cách cung cấp giao diện nhất quán hoạt động trên cả hai phiên bản của python. Ví dụ: chúng ta có thể sử dụng hàm rút gọn như được hiển thị trong đoạn mã bên dưới. Hàm này hoạt động trên cả Python 2 và Python 3