Sự khác biệt giữa python 2 và python 3 là gì?

Ngôn ngữ lập trình Python 3 được phát hành vào tháng 12 năm 2008 và là phiên bản tiếp theo nhằm cải thiện và thay thế Python 2. Nó đã giới thiệu nhiều bản sửa đổi cú pháp cùng với một thư viện tiêu chuẩn lớn hơn nhiều để cải thiện khả năng sử dụng và trải nghiệm lập trình của Python. Do những thay đổi này, Python 3 không tương thích ngược trực tiếp với Python 2. Điều này không giống như hầu hết các ngôn ngữ lập trình chính thống khác như Java, ngôn ngữ duy trì sự nhấn mạnh vào khả năng tương thích ngược. Sự phá vỡ khả năng tương thích ngược đã cho phép python phát triển và phù hợp với các phương pháp lập trình hiện đại. Tuy nhiên, nó cũng đã để lại hàng triệu dòng cơ sở mã Python 2 kế thừa và các mô-đun có thể vẫn cần được làm việc và duy trì. Để làm việc với các cơ sở mã này và có thể chuyển chúng sang Python 3, chúng ta cần hiểu sự khác biệt giữa Python 2 và 3. Quay lại __tương lai__

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ính

Sự 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ăn

1

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

loại(in)

        ^

Lỗi cú pháp. cú pháp không hợp lệ

con trăn

1

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

loại(in)

        ^

Lỗi cú pháp. cú pháp không hợp lệ


Phân công

Theo mặc định, Python2 thực hiện phép chia số nguyên bất cứ khi nào chúng ta sử dụng toán tử “ / ”. Tuy nhiên, Python 3 thực hiện phép chia dấu phẩy động trên các toán hạng của toán tử “ / ”. Chúng ta vẫn có thể thực hiện phép chia số nguyên trong Python3 bằng cách sử dụng toán tử “ // “ (hai dấu gạch chéo lên phía trước). Hành vi này có thể thu được trong Python 2 bằng cách nhập phép chia từ __future__ .

con trăn

1

2

3

4

5

6

7

8

9

10

11

 

$ python3

>>> 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ăn

1

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ăn

1

2

3

 

từ . nhập mod                       # mod.py exists in the same directory

từ . gói phụ nhập another_mod     # subpackage is a sub-directory

 

Chữ Unicode

Chuỗi theo mặc định là byte ASCII trong Python 2, chúng có thể được chuyển đổi thành unicode bằng cách sử dụng tiền tố 'u' hoặc unicode() function. Python 3 uses unicode strings by default, they can be converted to bytes using the 'b' hoặc sử dụng . function.

con trăn

1

2

3

4

5

6

7

8

 

$ python3

>>> str = 'hello world'  # unicode string

>>> str_b = b'hello bytes'  # bytes string

>>> loại(str_b)

<lớp 'byte'>

>>> byte(str, 'utf-8')  # convert unicode to bytes

b'xin chào thế giới'

con trăn

1

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ăn

1

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, 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,  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ăn

1

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ăn

1

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

 


Liệt kê không gian tên biến hiểu

Python 2 rò rỉ biến lặp được sử dụng trong phần hiểu danh sách vào không gian tên phạm vi. Điều này sẽ gán lại giá trị của các biến có cùng tên với biến lặp với giá trị của phần tử cuối cùng được lặp trong phần hiểu danh sách. Python 3 không cho phép biến lặp bị rò rỉ vào không gian tên của phạm vi kèm theo

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

 

$ python2

>>> 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ăn

1

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

Python 2 hay Python 3 cái nào tốt hơn?

Mặc dù Python 2 đã có thời hoàng kim vào đầu những năm 2000, nhưng Python 3 là lựa chọn tốt nhất để học vào năm 2022 . Bạn có thể thấy một số trường hợp cần sử dụng Python 2, nhưng nhìn chung, Python 3 là ngôn ngữ phổ biến nhất. Kể từ khi Python 2 ngừng hoạt động vào năm 2020, Python 3 đã thống trị thế giới lập trình.

Tại sao Python 2 tốt hơn 3?

Lịch sử của Python 2 so với. Trăn 3. Python 2 ra mắt vào năm 2000. Bản nâng cấp lên ngôn ngữ được thiết kế để giúp người bình thường học dễ dàng hơn, nhưng nó cũng bổ sung nhiều tính năng mà các nhà phát triển cần, như hiểu danh sách, hỗ trợ Unicode, thu gom rác và hỗ trợ cải tiến cho lập trình hướng đối tượng

Cái nào nhanh hơn Python 2 hoặc 3?

Về tốc độ, Python 3. 7 là 1. Nhanh hơn 19 lần so với Python 2. 7 .

Tôi có thể sử dụng Python 3 nếu tôi biết Python 2 không?

Python 3 là phiên bản mới hơn của ngôn ngữ lập trình Python được phát hành vào tháng 12 năm 2008. Phiên bản này chủ yếu được phát hành để khắc phục các sự cố tồn tại trong Python 2. Bản chất của những thay đổi này là Python 3 không tương thích với Python 2 . Nó không tương thích ngược.