What key features should you point out when demonstrating 2023 kicks’ efficient performance?

Trăn 3. 11 được xuất bản vào ngày 24 tháng 10 năm 2022. Phiên bản Python mới nhất này nhanh hơn và thân thiện hơn với người dùng. Sau mười bảy tháng phát triển, nó hiện đã sẵn sàng để sử dụng vào thời gian chính

Như trong mọi phiên bản, Python 3. 11 đi kèm với rất nhiều cải tiến và thay đổi. Bạn có thể xem danh sách tất cả chúng trong tài liệu. Tại đây, bạn sẽ khám phá những tính năng mới thú vị và có tác động mạnh nhất

Trong hướng dẫn này, bạn sẽ tìm hiểu về các tính năng và cải tiến mới như

  • Thông báo lỗi tốt hơn với nhiều truy nguyên thông tin hơn
  • Thực thi mã nhanh hơn do nỗ lực đáng kể trong dự án Faster CPython
  • Các nhóm tác vụ và ngoại lệ giúp đơn giản hóa công việc với mã không đồng bộ
  • Một số tính năng gõ mới giúp cải thiện khả năng hỗ trợ gõ tĩnh của Python
  • Hỗ trợ TOML gốc để làm việc với các tệp cấu hình

Nếu bạn muốn thử bất kỳ ví dụ nào trong hướng dẫn này, thì bạn sẽ cần sử dụng Python 3. 11. Hướng dẫn cài đặt & thiết lập Python 3 và làm cách nào bạn có thể cài đặt phiên bản Python trước khi phát hành?

Ngoài việc tìm hiểu thêm về các tính năng mới sắp có trong ngôn ngữ này, bạn cũng sẽ nhận được một số lời khuyên về những điều cần cân nhắc trước khi nâng cấp lên phiên bản mới. Nhấp vào liên kết bên dưới để tải xuống các ví dụ mã thể hiện các khả năng mới của Python 3. 11

Tải xuống miễn phí. Nhấp vào đây để tải xuống mã mẫu miễn phí thể hiện một số tính năng mới của Python 3. 11

Truy nguyên lỗi thông tin khác

Python thường được công nhận là ngôn ngữ lập trình tốt cho người mới bắt đầu, với cú pháp dễ đọc và cấu trúc dữ liệu mạnh mẽ. Một thách thức đối với tất cả mọi người, đặc biệt là những người mới sử dụng Python, là làm thế nào để diễn giải truy nguyên được hiển thị khi Python gặp lỗi

Trong Python 3. 10, thông báo lỗi của Python đã được cải thiện rất nhiều. Tương tự, một trong Python 3. Các tính năng được mong đợi nhất của 11 cũng sẽ nâng cao trải nghiệm nhà phát triển của bạn. Chú thích trang trí được thêm vào truy nguyên và có thể giúp bạn diễn giải thông báo lỗi nhanh hơn

Để xem ví dụ nhanh về truy nguyên nâng cao, hãy thêm mã sau vào tệp có tên

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
6

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]

Bạn có thể sử dụng

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
7 để tính nghịch đảo nhân của một số. Không có nghịch đảo nhân của
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
8, vì vậy mã của bạn sẽ phát sinh lỗi khi bạn chạy nó

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero

Lưu ý các ký hiệu

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
9 và
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
0 được nhúng trong truy nguyên. Chúng được sử dụng để hướng sự chú ý của bạn đến mã gây ra lỗi. Như thường lệ với truy nguyên, bạn nên bắt đầu từ dưới cùng và tiến dần lên. Trong ví dụ này, một
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
1 là do phép chia
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
2. Thủ phạm thực sự đang gọi
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
3, vì
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
8 không có nghịch đảo

Nhận trợ giúp bổ sung này trong việc phát hiện ra những sai lầm rất hữu ích. Tuy nhiên, các dấu vết được chú thích thậm chí còn mạnh hơn nếu mã của bạn phức tạp hơn. Chúng có thể truyền tải thông tin mà trước đây bạn không thể tự nhận được từ quá trình truy nguyên.

Để đánh giá cao sức mạnh của truy nguyên được cải thiện, bạn sẽ xây dựng một trình phân tích cú pháp nhỏ thông tin về một số lập trình viên. Giả sử bạn có một tệp tên là

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
5 với nội dung sau

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
2

Lưu ý rằng thông tin về các lập trình viên khá mâu thuẫn. Mặc dù thông tin về Grace Hopper và Ole-Johan Dahl đã đầy đủ, nhưng bạn đang thiếu ngày và tháng sinh của Ada Lovelace cũng như năm mất của cô ấy. Đương nhiên, bạn chỉ có thông tin khai sinh về Guido van Rossum. Trên hết, bạn chỉ ghi lại tên của chú Barry

Bạn sẽ tạo một lớp có thể bọc thông tin này. Bắt đầu bằng cách đọc thông tin từ tệp JSON

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
3

Bạn sử dụng

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
6 để đọc tệp JSON và
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
7 để phân tích thông tin thành danh sách từ điển Python

Tiếp theo, bạn sẽ sử dụng một lớp dữ liệu để đóng gói thông tin về từng lập trình viên

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
6

Mỗi

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 sẽ có thuộc tính
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
9 và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
90. Ngoài ra, bạn thêm một hàm tạo tiện lợi có thể khởi tạo
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 dựa trên thông tin và cấu trúc trong tệp JSON của bạn

Bạn cũng sẽ thêm một chức năng có thể khởi tạo hai đối tượng

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 cùng một lúc

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
2

Hàm

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
93 sử dụng hàm tạo
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
94 hai lần để chuyển đổi một cặp lập trình viên từ cấu trúc JSON sang đối tượng
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8

Đã đến lúc khám phá mã của bạn và đặc biệt là xem xét một số dấu vết. Chạy chương trình của bạn với cờ

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
96 để mở REPL tương tác của Python với tất cả các biến, lớp và hàm có sẵn

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]

Thông tin của Grace đã hoàn tất, vì vậy bạn có thể gói gọn cô ấy vào một đối tượng

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 với thông tin về tên đầy đủ và tuổi thọ của cô ấy

Để xem truy nguyên mới đang hoạt động, hãy thử chuyển đổi chú Barry

>>>

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'

Bạn nhận được

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
98 vì thiếu
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
99. Mặc dù bạn có thể nhớ rằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
99 là một trường con trong
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
9, nhưng các chú thích ngay lập tức chỉ ra điều này cho bạn

Tương tự, hãy nhớ rằng thông tin về tuổi thọ của Ada là không đầy đủ. Bạn không thể tạo một đối tượng

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 cho cô ấy

>>>

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
9

Bạn đang nhận được một

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
98 khác, lần này là do thiếu
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
74. Trong trường hợp này, truy nguyên thậm chí còn hữu ích hơn trong ví dụ trước. Bạn có hai trường con ________ 374, một cho ________ 376 và một cho
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
77. Chú thích truy nguyên ngay lập tức cho bạn thấy rằng bạn đang bỏ lỡ một năm chết

Điều gì xảy ra với Guido?

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
7

Trong trường hợp này, một

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
78 được nâng lên. Bạn có thể đã thấy các loại lỗi loại
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
79 này trước đây. Chúng có thể nổi tiếng là khó gỡ lỗi vì không rõ đối tượng nào là
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
00 bất ngờ. Tuy nhiên, từ chú thích, bạn sẽ thấy rằng
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
01 là
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
00 trong ví dụ này

Trong ví dụ cuối cùng, bạn sẽ khám phá điều gì sẽ xảy ra với các lệnh gọi hàm lồng nhau. Hãy nhớ rằng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
93 gọi
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
04 hai lần. Bây giờ, hãy thử ghép đôi Ada và Ole-Johan

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
0

Cố gắng gói gọn Ada tăng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
98 giống như trước đó. Tuy nhiên, hãy lưu ý truy nguyên từ bên trong
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
93. Bởi vì hàm gọi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
94 hai lần, thông thường sẽ cần một số nỗ lực để tìm hiểu xem có xảy ra lỗi khi xử lý
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
08 hoặc
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09 hay không. Trong phiên bản Python mới nhất, bạn sẽ thấy ngay rằng các sự cố là do
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09 gây ra

Các truy nguyên này giúp gỡ lỗi trong Python 3. 11 dễ dàng hơn trong các phiên bản trước. Bạn có thể xem thêm ví dụ, thông tin thêm về cách triển khai truy nguyên và các công cụ khác mà bạn có thể sử dụng để gỡ lỗi trong Python 3. 11 hướng dẫn xem trước Thông báo lỗi thậm chí còn tốt hơn. Để biết thêm chi tiết kỹ thuật, hãy xem PEP 657

Truy nguyên được chú thích sẽ là một lợi ích cho năng suất của bạn với tư cách là nhà phát triển Python. Một sự phát triển thú vị khác là Python 3. 11 là phiên bản Python nhanh nhất

Loại bỏ các quảng cáo

Thực thi mã nhanh hơn

Python nổi tiếng là một ngôn ngữ chậm. Ví dụ: một vòng lặp thông thường trong Python có độ lớn chậm hơn một vòng lặp tương tự trong C. Nhược điểm này được khắc phục bằng nhiều cách. Thông thường năng suất của lập trình viên quan trọng hơn thời gian thực thi mã

Python cũng rất có khả năng gói các thư viện được viết bằng các ngôn ngữ nhanh hơn. Ví dụ: các phép tính được thực hiện trong NumPy nhanh hơn nhiều so với các phép tính tương tự được thực hiện trong Python thuần túy. Phù hợp với việc dễ dàng phát triển mã, điều này khiến Python trở thành một ứng cử viên nặng ký trong không gian khoa học dữ liệu

Tuy nhiên, đã có một nỗ lực để làm cho ngôn ngữ Python cốt lõi nhanh hơn. Vào mùa thu năm 2020, Mark Shannon đã đề xuất một số cải tiến hiệu suất có thể triển khai trong Python. Đề xuất, được gọi là Kế hoạch Shannon, rất tham vọng và hy vọng sẽ làm cho Python nhanh hơn năm lần trong một số bản phát hành

Microsoft đã tham gia và hiện đang hỗ trợ một nhóm các nhà phát triển—bao gồm Mark Shannon và người tạo ra Python, Guido van Rossum—làm việc trong dự án Faster CPython, như dự án hiện được biết đến. Có nhiều cải tiến trong Python 3. 11 dựa trên dự án Faster CPython. Trong phần này, bạn sẽ tìm hiểu về trình thông dịch thích ứng chuyên dụng. Trong các phần sau, bạn cũng sẽ tìm hiểu về thời gian khởi động nhanh hơn và các trường hợp ngoại lệ không có chi phí

PEP 659 mô tả một trình thông dịch thích ứng chuyên dụng. Ý tưởng chính là tăng tốc mã trong khi nó đang chạy bằng cách tối ưu hóa các hoạt động được thực hiện thường xuyên. Điều này tương tự với quá trình biên dịch đúng lúc [JIT], ngoại trừ việc nó không ảnh hưởng đến quá trình biên dịch. Thay vào đó, mã byte của Python được điều chỉnh hoặc thay đổi nhanh chóng

Ghi chú. Mã Python được biên dịch thành mã byte trước khi chạy. Mã byte bao gồm nhiều hướng dẫn cơ bản hơn mã Python thông thường, vì vậy mỗi dòng Python được chuyển đổi thành một số câu lệnh mã byte

Bạn có thể sử dụng

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
11 để xem mã byte của Python. Ví dụ, hãy xem xét một hàm có thể chuyển đổi từ feet sang mét

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
1

Bạn có thể tách chức năng này thành mã byte bằng cách gọi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
12

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
2

Mỗi dòng hiển thị thông tin về một lệnh bytecode. Năm cột là số dòng, địa chỉ byte, tên mã hoạt động, tham số hoạt động và giải thích các tham số trong ngoặc đơn

Nói chung, bạn không cần biết về bytecode để viết Python. Tuy nhiên, nó có thể giúp bạn hiểu cách Python hoạt động bên trong

Một bước mới gọi là tăng tốc đã được thêm vào quá trình tạo mã byte. Điều này nhận các hướng dẫn có thể được tối ưu hóa trong thời gian chạy và thay thế chúng bằng các hướng dẫn thích ứng. Mỗi hướng dẫn như vậy sẽ xem xét cách nó được sử dụng và có thể tự chuyên môn hóa cho phù hợp

Quá trình khởi động nhanh khi một chức năng đã được gọi một số lần nhất định. Trong Python 3. 11, điều này xảy ra sau tám lần gọi. Bạn có thể quan sát cách trình thông dịch điều chỉnh mã byte bằng cách gọi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
13 và đặt tham số
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
14. Đầu tiên xác định một hàm và gọi nó bảy lần với các số dấu phẩy động làm đối số

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
3

Tiếp theo, hãy xem bytecode của

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
15

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
4

Bạn sẽ không quan sát thấy bất cứ điều gì đặc biệt. Phiên bản mã byte này vẫn giống như phiên bản không thích ứng. Điều đó thay đổi khi bạn gọi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
15 lần thứ tám

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
5

Giờ đây, một số hướng dẫn ban đầu đã được thay thế bằng các hướng dẫn chuyên biệt. Ví dụ: ________ 417 đã được chuyên hóa thành ________ 418, phép nhân hai số

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
19 nhanh hơn

Ngay cả khi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
15 đã được tối ưu hóa cho trường hợp
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
21 là tham số
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
19, thì nó vẫn hoạt động bình thường đối với các loại tham số khác bằng cách quay lại hướng dẫn mã byte ban đầu. Các hoạt động nội bộ đã thay đổi, nhưng mã của bạn sẽ hoạt động giống hệt như trước đây

Các hướng dẫn chuyên biệt vẫn còn thích ứng. Gọi hàm của bạn thêm năm mươi hai lần nữa, nhưng bây giờ với đối số là số nguyên

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
6

Trình thông dịch Python vẫn hy vọng có thể nhân hai số

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
19. Khi bạn gọi
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
15 một lần nữa với một số nguyên, nó sẽ ngừng hoạt động và chuyển đổi trở lại một hướng dẫn thích ứng, không chuyên biệt

>>>

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
7

Trong trường hợp này, hướng dẫn mã byte được thay đổi thành

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
25 chứ không phải
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
26 vì một trong các toán tử,
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
27, luôn là số dấu phẩy động

Phép nhân giữa số nguyên và số dấu phẩy động khó tối ưu hóa hơn phép nhân giữa các số cùng loại. Ít nhất là hiện tại, không có hướng dẫn chuyên biệt nào để thực hiện phép nhân giữa

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
19 và
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
29

Ví dụ này nhằm cung cấp cho bạn một số thông tin chi tiết về cách thức hoạt động của trình thông dịch chuyên biệt thích ứng. Nói chung, bạn không nên lo lắng về việc thay đổi mã hiện tại của mình để tận dụng nó. Hầu hết mã của bạn sẽ đơn giản chạy nhanh hơn vì nó là

Điều đó nói rằng, có một số trường hợp bạn có thể cấu trúc lại mã của mình để nó có thể được chuyên môn hóa hiệu quả hơn. Brandt Bucher's

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
30 là một công cụ trực quan hóa cách trình thông dịch xử lý mã của bạn. Hướng dẫn hiển thị một ví dụ về cải thiện mã theo cách thủ công. Bạn có thể tìm hiểu thêm trên podcast Talk Python to Me

Một vài hướng dẫn quan trọng cho dự án Faster CPython là

  • Dự án sẽ không giới thiệu bất kỳ thay đổi vi phạm nào đối với Python
  • Hiệu suất của hầu hết các mã nên được cải thiện

Trong điểm chuẩn, “CPython 3. 11 trung bình nhanh hơn 25% so với CPython 3. 10” [Nguồn]. Tuy nhiên, bạn nên quan tâm nhiều hơn đến cách Python 3. 11 hoạt động trên mã của bạn tốt hơn mức độ hoạt động của nó trên điểm chuẩn. Mở rộng hộp bên dưới để biết một số ý tưởng về cách bạn có thể đo hiệu suất mã của riêng mình

Đo hiệu suất mã của bạnHiển thị/Ẩn

Nói chung, có ba cách tiếp cận mà bạn sẽ sử dụng để đo hiệu suất mã

  1. Điểm chuẩn các đoạn mã nhỏ quan trọng trong chương trình của bạn
  2. Hồ sơ chương trình của bạn để tìm các nút cổ chai có thể được cải thiện
  3. Theo dõi hiệu suất của toàn bộ chương trình của bạn

Thông thường, bạn muốn làm tất cả những điều này. Điểm chuẩn có thể giúp bạn chọn giữa các cách triển khai khác nhau trong khi bạn đang phát triển mã của mình. Python có hỗ trợ tích hợp cho điểm chuẩn vi mô với mô-đun

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
31. Công cụ
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
32 của bên thứ ba rất tốt cho các chức năng đo điểm chuẩn. Ngoài ra,
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
33 là bộ điểm chuẩn được dự án Faster CPython sử dụng để đo lường các cải tiến

Trình lược tả mã rất hữu ích nếu bạn cần tăng tốc chương trình của mình và muốn tìm ra phần mã nào cần tập trung vào. Thư viện tiêu chuẩn của Python cung cấp

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
34, bạn có thể sử dụng để thu thập số liệu thống kê về chương trình của mình và
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
35, bạn có thể sử dụng để khám phá các số liệu thống kê đó

Cách tiếp cận thứ ba, giám sát thời gian chạy chương trình của bạn, là điều bạn nên làm với tất cả các chương trình chạy trong hơn một vài giây. Cách tiếp cận đơn giản nhất là thêm bộ đếm thời gian vào thông điệp tường trình của bạn. Bên thứ ba

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
36 cho phép bạn làm điều này, ví dụ bằng cách thêm một công cụ trang trí vào chức năng chính của bạn

Một cách thiết yếu và dễ tiếp cận mà bạn có thể đóng góp để làm cho Python nhanh hơn là chia sẻ các điểm chuẩn minh họa cho các trường hợp sử dụng của bạn. Đặc biệt nếu bạn không nhận thấy nhiều tốc độ tăng tốc trong Python 3. 11, sẽ rất hữu ích cho các nhà phát triển cốt lõi nếu bạn có thể chia sẻ mã của mình. Xem bài nói nhanh của Mark Shannon, Cách bạn có thể giúp tăng tốc Python, để biết thêm thông tin

Dự án Faster CPython là một nỗ lực không ngừng và đã có một số tối ưu hóa được dự kiến ​​phát hành với Python 3. 12 tháng 10 năm 2023. Bạn có thể theo dõi dự án trên GitHub. Để tìm hiểu thêm, bạn cũng có thể xem các cuộc thảo luận và trình bày sau đây

  • Nói Python với tôi. Làm Python nhanh hơn với Guido và Mark
  • EuroPython 2022. Cách chúng tôi tạo ra Python 3. 11 Nhanh hơn của Mark Shannon
  • Nói Python với tôi. Python hoàn hảo. Phiên dịch chuyên biệt, thích ứng với Brandt Bucher
  • PyCon ES. Dự án CPython nhanh hơn. Như thế nào là haciendo Python 3. 11 más quickido của Pablo Galindo Salgado, bằng tiếng Tây Ban Nha

Faster CPython là một dự án lớn liên quan đến tất cả các phần của Python. Trình thông dịch chuyên biệt thích ứng là một phần của nỗ lực. Ở phần sau của hướng dẫn này, bạn sẽ tìm hiểu về hai cách tối ưu hóa khác. khởi động nhanh hơn và ngoại lệ chi phí bằng không

Loại bỏ các quảng cáo

Cú pháp đẹp hơn cho các tác vụ không đồng bộ

Hỗ trợ lập trình không đồng bộ trong Python đã phát triển trong một thời gian dài. Các nền tảng đã được đặt trong kỷ nguyên Python 2 với việc bổ sung các trình tạo. Thư viện

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37 ban đầu được thêm vào Python 3. 4, và các từ khóa
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
38 và
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
39 theo sau trong Python 3. 5

Sự phát triển đã tiếp tục trong các bản phát hành sau này, với nhiều cải tiến nhỏ được thêm vào các khả năng không đồng bộ của Python. Trong Python 3. 11, bạn có thể sử dụng các nhóm tác vụ, cung cấp cú pháp rõ ràng hơn để chạy và giám sát các tác vụ không đồng bộ

Ghi chú. Nếu bạn chưa quen với lập trình bất đồng bộ trong Python, thì bạn có thể xem các tài nguyên sau để bắt đầu

  • Tăng tốc chương trình Python của bạn với tính đồng thời
  • Bắt đầu với các tính năng không đồng bộ trong Python
  • IO không đồng bộ trong Python. Hướng dẫn hoàn chỉnh

Bạn cũng có thể tìm hiểu thêm chi tiết về các nhóm tác vụ không đồng bộ trong Python 3. 11 Xem trước. Nhóm nhiệm vụ và ngoại lệ

Thư viện

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37 là một phần của thư viện chuẩn của Python. Tuy nhiên, đó không phải là cách duy nhất để làm việc không đồng bộ. Có một số thư viện phổ biến của bên thứ ba cung cấp các khả năng tương tự, bao gồm Trio và Curio. Ngoài ra, các gói như uvloop, AnyIO và Quattro nâng cao
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37 với hiệu suất tốt hơn và nhiều tính năng hơn

Cách truyền thống để chạy một số tác vụ không đồng bộ với

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37 là tạo các tác vụ với
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
43 và sau đó đợi chúng với
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44. Điều này hoàn thành các nhiệm vụ, nhưng nó hơi cồng kềnh khi làm việc với

Để tổ chức các nhiệm vụ dành cho trẻ em, Curio đã giới thiệu các nhóm nhiệm vụ và Trio đã giới thiệu các vườn ươm như các lựa chọn thay thế. Các nhóm nhiệm vụ

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37 mới được lấy cảm hứng rất nhiều từ những

Khi bạn tổ chức các tác vụ không đồng bộ của mình với ________ 444, một phần mã của bạn thường trông như thế này

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
8

Bạn theo dõi thủ công tất cả các nhiệm vụ của mình trong một danh sách trước khi chuyển chúng tới

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44. Bằng cách chờ đợi trên
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44, bạn đảm bảo rằng mỗi nhiệm vụ được thực hiện trước khi tiếp tục

Mã tương đương đơn giản hơn với các nhóm tác vụ. Thay vì sử dụng

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44, bạn sử dụng trình quản lý ngữ cảnh để xác định thời điểm các nhiệm vụ sẽ được chờ đợi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
9

Bạn tạo một đối tượng nhóm nhiệm vụ, có tên là

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
50 trong ví dụ này và sử dụng phương thức
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
51 của nó để tạo nhiệm vụ mới

Để xem một ví dụ chính thức, hãy xem xét tác vụ tải xuống một số tệp. Bạn muốn tải xuống văn bản của một số tài liệu PEP lịch sử cho thấy các tính năng không đồng bộ của Python đã phát triển như thế nào. Để hiệu quả, bạn sẽ sử dụng thư viện của bên thứ ba

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
52 để tải xuống các tệp không đồng bộ

Bắt đầu bằng cách nhập các thư viện cần thiết và lưu ý URL tới kho lưu trữ nơi lưu trữ văn bản của mỗi PEP

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
20

Bạn thêm một hàm

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
53 khởi tạo phiên
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
52 để quản lý nhóm kết nối có thể được sử dụng lại. Hiện tại, bạn đang gọi một hàm, tên là
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
55, mà bạn chưa viết. Chức năng này sẽ tạo một tác vụ cho mỗi PEP cần tải xuống

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
21

Điều này tuân theo mô hình mà bạn đã thấy trước đó. Mỗi nhiệm vụ bao gồm chạy

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
56, mà bạn sẽ xác định tiếp theo. Khi bạn đã thiết lập tất cả các nhiệm vụ, bạn chuyển chúng cho
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44

Mỗi tác vụ tải xuống một PEP. Bạn sẽ thêm một vài cuộc gọi

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
58 để bạn có thể thấy điều gì đang xảy ra

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
22

Đối với mỗi PEP, bạn tìm URL riêng của nó và sử dụng

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
59 để tải xuống. Khi bạn có văn bản của PEP, bạn tìm tiêu đề của PEP và in nó ra bàn điều khiển

Cuối cùng, chạy

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
53 không đồng bộ

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
23

Bạn đang gọi mã của mình bằng một danh sách các số PEP, tất cả đều liên quan đến các tính năng không đồng bộ trong Python. Chạy tập lệnh của bạn để xem nó hoạt động như thế nào

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
24

Bạn có thể thấy rằng tất cả các lượt tải xuống đang diễn ra cùng một lúc, bởi vì tất cả các tác vụ đều in rằng chúng bắt đầu tải xuống PEP trước khi bất kỳ tác vụ nào báo cáo rằng chúng đã hoàn thành. Ngoài ra, hãy lưu ý rằng các tác vụ được bắt đầu theo thứ tự mà bạn đã xác định, với các PEP theo thứ tự số

Ngược lại, các nhiệm vụ kết thúc theo thứ tự dường như ngẫu nhiên. Cuộc gọi đến

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44 đảm bảo rằng tất cả các tác vụ được thực hiện trước khi mã của bạn tiếp tục

Bạn có thể cập nhật mã của mình để sử dụng nhóm tác vụ thay vì

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
44. Đầu tiên, sao chép
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
63 vào một tệp mới có tên
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
64. Các tệp này sẽ khá giống nhau. Bạn chỉ cần sửa hàm
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
55

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
25

Lưu ý rằng mã của bạn tuân theo mẫu chung được nêu trước ví dụ. Trước tiên, bạn thiết lập một nhóm tác vụ bên trong trình quản lý ngữ cảnh, sau đó bạn sử dụng nhóm tác vụ đó để tạo các tác vụ con. một nhiệm vụ cho mỗi PEP để tải xuống. Chạy mã đã cập nhật của bạn và quan sát xem mã đó hoạt động giống như phiên bản cũ hơn

Một thách thức khi bạn đang làm việc với một số tác vụ không đồng bộ là bất kỳ tác vụ nào trong số chúng có thể gây ra lỗi bất kỳ lúc nào. Về lý thuyết, hai hoặc nhiều tác vụ thậm chí có thể gây ra lỗi cùng một lúc

Các thư viện như Trio và Curio đã xử lý việc này bằng một loại đối tượng đa lỗi đặc biệt. Điều này đã hoạt động nhưng hơi cồng kềnh vì Python không cung cấp nhiều cách hỗ trợ tích hợp

Để hỗ trợ xử lý lỗi đúng cách trong các nhóm tác vụ, Python 3. 11 giới thiệu các nhóm ngoại lệ được thiết kế để theo dõi một số lỗi đồng thời. Bạn sẽ tìm hiểu thêm về chúng sau trong hướng dẫn này

Các nhóm tác vụ sử dụng các nhóm ngoại lệ để cung cấp hỗ trợ xử lý lỗi tốt hơn so với phương pháp cũ. Để thảo luận sâu hơn về các nhóm nhiệm vụ, hãy xem Python 3. 11 Xem trước. Nhóm nhiệm vụ và ngoại lệ. Bạn có thể tìm hiểu thêm về các nguyên tắc cơ bản trong Lý luận của Guido van Rossum về

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
66

Loại bỏ các quảng cáo

Biến loại được cải thiện

Python là một ngôn ngữ được gõ động, nhưng nó hỗ trợ gõ tĩnh thông qua các gợi ý kiểu tùy chọn. Nền tảng của hệ thống kiểu tĩnh của Python đã được định nghĩa trong PEP 484 vào năm 2015. Kể từ Python 3. 5, một số đề xuất mới liên quan đến đánh máy đã được giới thiệu cho mọi bản phát hành Python

Có năm PEP liên quan đến đánh máy được công bố cho Python 3. 11—cao kỷ lục

  • PEP 646. Thuốc generic biến thể
  • PEP 655. Đánh dấu các mục
    $ python inverse.py
    Traceback [most recent call last]:
      File "/home/realpython/inverse.py", line 6, in 
        print[inverse[0]]
              ^^^^^^^^^^
      File "/home/realpython/inverse.py", line 4, in inverse
        return 1 / number
               ~~^~~~~~~~
    ZeroDivisionError: division by zero
    
    67 riêng lẻ theo yêu cầu hoặc có khả năng bị thiếu
  • PEP 673. loại
    $ python inverse.py
    Traceback [most recent call last]:
      File "/home/realpython/inverse.py", line 6, in 
        print[inverse[0]]
              ^^^^^^^^^^
      File "/home/realpython/inverse.py", line 4, in inverse
        return 1 / number
               ~~^~~~~~~~
    ZeroDivisionError: division by zero
    
    68
  • PEP 675. Kiểu chuỗi ký tự tùy ý
  • PEP 681. Biến đổi lớp dữ liệu

Trong phần này, bạn sẽ tập trung vào hai trong số này. variadic generics và loại

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68. Để biết thêm thông tin, hãy xem các tài liệu PEP và mức độ phù hợp của việc gõ trong Python 3 này. 11 bản xem trước

Ghi chú. Hỗ trợ cho các tính năng nhập tùy thuộc vào trình kiểm tra loại của bạn ngoài phiên bản Python của bạn. Ví dụ: một số tính năng mới không được hỗ trợ bởi mypy tại thời điểm Python 3. 11 phát hành

Các biến loại đã là một phần của hệ thống gõ tĩnh của Python ngay từ đầu. Bạn sử dụng chúng để tham số hóa các loại chung. Nói cách khác, nếu bạn có một danh sách, thì bạn có thể sử dụng biến kiểu để kiểm tra loại mục bên trong danh sách

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
26

Hàm

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
70 chọn phần tử đầu tiên từ một loại trình tự, chẳng hạn như danh sách. Mã hoạt động giống nhau độc lập với loại phần tử của chuỗi. Tuy nhiên, bạn cần theo dõi các loại phần tử để biết loại trả về của
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
70

Biến kiểu thực hiện chính xác điều này. Ví dụ: nếu bạn chuyển một danh sách các số nguyên tới

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
70, thì
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
73 sẽ được đặt thành
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
29 trong quá trình kiểm tra kiểu. Do đó, trình kiểm tra loại có thể suy luận rằng lệnh gọi
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
70 này trả về
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
29. Trong ví dụ này, danh sách được gọi là một loại chung vì nó có thể được tham số hóa bởi các loại khác

Một mẫu đã phát triển theo thời gian cố gắng giải quyết vấn đề về gợi ý loại đề cập đến lớp hiện tại. Nhớ lại lớp

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 trước đó

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
6

Hàm tạo

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
94 trả về một đối tượng
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8. Tuy nhiên, bạn không được phép sử dụng
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
80 làm gợi ý loại cho giá trị trả về của
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
94 vì lớp
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 không được xác định đầy đủ tại thời điểm này trong mã của bạn

Ngoài ra, nếu bạn được phép sử dụng

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
80, thì điều này sẽ không hoạt động tốt với tính năng kế thừa. Nếu bạn đã tạo một lớp con của
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8, thì
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
94 sẽ trả về lớp con đó chứ không phải đối tượng
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8

Một giải pháp cho thách thức này là sử dụng một biến kiểu liên kết với lớp của bạn

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
28

Bạn chỉ định

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
87 để đảm bảo rằng
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
88 sẽ chỉ là
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8 hoặc một trong các lớp con của nó. Mẫu này hoạt động, nhưng nó không đặc biệt dễ đọc. Nó cũng buộc bạn phải chú thích
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
90 hoặc
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
91, điều này thường không cần thiết

Bây giờ bạn có thể sử dụng loại

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68 mới để thay thế. Nó sẽ luôn đề cập đến lớp đóng gói, vì vậy bạn sẽ không phải xác định biến kiểu theo cách thủ công. Đoạn mã sau tương đương với ví dụ trước

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
29

Bạn có thể nhập

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68 từ
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
94. Bạn không cần tạo biến kiểu hoặc chú thích
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
91. Thay vào đó, bạn lưu ý rằng phương thức trả về
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68, sẽ tham chiếu đến
>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
8

Xem Python 3. 11 Xem trước một ví dụ khác về cách sử dụng

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68. Bạn cũng có thể xem PEP 673 để biết thêm chi tiết

Một hạn chế của biến kiểu là chúng chỉ có thể thay thế cho một kiểu tại một thời điểm. Giả sử bạn có một hàm đảo ngược thứ tự của một bộ hai phần tử

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
30

Ở đây,

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
99 được coi là một bộ có hai phần tử. Các phần tử có thể thuộc các kiểu khác nhau, vì vậy bạn cần có hai biến kiểu để chú thích hàm của mình

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
31

Viết hơi rườm rà nhưng không sao. Các chú thích là rõ ràng và có thể đọc được. Thách thức xảy ra nếu bạn muốn chú thích một biến thể của mã hoạt động cho các bộ có số lượng phần tử tùy ý

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
32

Với

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
200, bạn di chuyển phần tử đầu tiên đến cuối bộ với số lượng phần tử tùy ý. Nếu bạn chuyển vào một cặp phần tử, thì điều này hoạt động tương đương với
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
201

Hãy suy nghĩ về cách bạn sẽ chú thích

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
200. Nếu
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
203 là một bộ có n phần tử, thì bạn cần n biến loại. Nhưng số lượng phần tử có thể là bất kỳ thứ gì, vì vậy bạn không biết mình cần bao nhiêu biến kiểu

PEP 646 giới thiệu TypeVarTuple để xử lý trường hợp sử dụng này. Một

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
204 có thể đại diện cho một số loại tùy ý. Do đó, bạn có thể sử dụng nó để chú thích một loại chung với các tham số biến đổi

Bạn có thể thêm gợi ý loại vào

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
200 như sau

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
33

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
204 sẽ thay thế bất kỳ số loại nào, vì vậy chú thích này sẽ hoạt động đối với các bộ dữ liệu có một, ba, mười một hoặc bất kỳ số lượng phần tử nào khác

Lưu ý rằng ngôi sao [

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
207] ở phía trước của
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
208 là một phần cần thiết của cú pháp. Nó giống với cú pháp giải nén mà bạn đã sử dụng trong mã của mình và nó nhắc bạn rằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
208 đại diện cho một số loại tùy ý

Trường hợp sử dụng thúc đẩy để giới thiệu các bộ biến kiểu đang chú thích hình dạng của các mảng nhiều chiều. Bạn có thể tìm hiểu thêm về ví dụ này trong Python 3 này. 11 bản xem trước và trong PEP

Để kết thúc phần này về gợi ý kiểu, hãy nhớ lại rằng kiểu gõ tĩnh kết hợp hai công cụ khác nhau. ngôn ngữ Python và trình kiểm tra kiểu. Để sử dụng các tính năng gõ mới, phiên bản Python của bạn phải hỗ trợ chúng. Ngoài ra, chúng cần được hỗ trợ bởi trình kiểm tra loại của bạn

Nhiều tính năng đánh máy, bao gồm

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
68 và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
204, được đưa vào các phiên bản Python cũ hơn trong gói
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
212. Trên Python 3. 10, bạn có thể sử dụng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
213 để cài đặt
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
214 vào môi trường ảo của mình và sau đó triển khai ví dụ cuối cùng như sau

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
34

Cú pháp

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
215 chỉ được phép trong Python 3. 11. Một giải pháp thay thế tương đương hoạt động trên các phiên bản Python cũ hơn là
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
216. Ngay cả khi mã của bạn hoạt động trên phiên bản Python của bạn, không phải tất cả các trình kiểm tra loại đều hỗ trợ
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
204

Loại bỏ các quảng cáo

Hỗ trợ phân tích cú pháp cấu hình TOML

TOML là viết tắt của Ngôn ngữ tối thiểu rõ ràng của Tom. Đó là định dạng tệp cấu hình đã trở nên phổ biến trong thập kỷ qua. Cộng đồng Python đã coi TOML là định dạng được lựa chọn khi chỉ định siêu dữ liệu cho các gói và dự án

TOML đã được thiết kế để con người dễ đọc và máy tính dễ phân tích cú pháp. Bạn có thể tự tìm hiểu về định dạng tệp cấu hình trong Python và TOML. Những người bạn tốt nhất mới

Mặc dù TOML đã được sử dụng trong nhiều năm bởi nhiều công cụ khác nhau, Python vẫn chưa hỗ trợ TOML tích hợp. Điều đó thay đổi trong Python 3. 11, khi

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 được thêm vào thư viện chuẩn. Mô-đun mới này được xây dựng dựa trên thư viện bên thứ ba phổ biến
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
219 và cho phép bạn phân tích cú pháp các tệp TOML

Sau đây là một ví dụ về tệp TOML có tên

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
220

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
35

Tệp chứa một số phần có tiêu đề trong ngoặc vuông. Mỗi phần như vậy được gọi là bảng trong TOML và tiêu đề của nó được gọi là khóa. Các bảng chứa các cặp khóa-giá trị. Các bảng có thể được lồng vào nhau sao cho các giá trị là các bảng mới. Trong ví dụ trên, bạn có thể thấy rằng mỗi bảng, ngoại trừ

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09, đều có cấu trúc giống nhau, với bốn khóa.
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
222,
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
223,
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
224 và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
225

Giá trị có thể có các loại khác nhau. Trong ví dụ này, bạn có thể thấy bốn loại dữ liệu

  1. # inverse.py
    
    def inverse[number]:
        return 1 / number
    
    print[inverse[0]]
    
    222 là một bảng nội tuyến, tương tự như từ điển của Python
  2. # inverse.py
    
    def inverse[number]:
        return 1 / number
    
    print[inverse[0]]
    
    223 là một mảng, tương tự như danh sách của Python
  3. # inverse.py
    
    def inverse[number]:
        return 1 / number
    
    print[inverse[0]]
    
    224 là một số, có thể là số nguyên hoặc số dấu phẩy động
  4. # inverse.py
    
    def inverse[number]:
        return 1 / number
    
    print[inverse[0]]
    
    225 là một chuỗi

TOML hỗ trợ thêm một số loại dữ liệu, bao gồm Booleans và ngày tháng. Xem Python và TOML. Những người bạn tốt nhất mới để biết chi tiết về định dạng và các ví dụ về cú pháp của nó

Bạn có thể sử dụng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 để đọc tệp TOML

>>>

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
36

Khi sử dụng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
231, bạn chuyển vào một đối tượng tệp phải được mở ở chế độ nhị phân bằng cách chỉ định
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
232. Ngoài ra, bạn có thể phân tích một chuỗi bằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
233

>>>

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
37

Trong ví dụ này, trước tiên bạn sử dụng

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
6 để đọc
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
220 thành một chuỗi, sau đó bạn phân tích chuỗi này bằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
236. Các tài liệu TOML nên được lưu trữ ở dạng mã hóa UTF-8. Bạn nên chỉ định mã hóa một cách rõ ràng để đảm bảo rằng mã của bạn chạy giống nhau trên tất cả các nền tảng

Tiếp theo, chuyển sự chú ý của bạn sang kết quả của việc gọi

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
237 hoặc
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
236. Trong các ví dụ trên, bạn thấy rằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
239 là một từ điển lồng nhau. Đây sẽ luôn là trường hợp.
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 phân tích tài liệu TOML thành từ điển Python

Trong phần còn lại của phần này, bạn sẽ thực hành làm việc với dữ liệu TOML trong Python. Bạn sẽ tạo một trình chuyển đổi đơn vị nhỏ để phân tích cú pháp tệp TOML của bạn và sử dụng từ điển kết quả

Ghi chú. Nếu bạn đang thực sự chuyển đổi đơn vị, thì bạn nên xem Pint. Thư viện này có thể chuyển đổi giữa hàng trăm đơn vị và được tích hợp tốt vào các gói khác như NumPy

Thêm mã của bạn vào tệp có tên

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
241

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
38

Bạn muốn có thể tra cứu từng đơn vị theo tên hoặc một trong các bí danh của đơn vị đó. Bạn đạt được điều này bằng cách sao chép thông tin đơn vị để mỗi bí danh có thể được sử dụng làm khóa từ điển

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
39

Ví dụ, từ điển

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
239 của bạn bây giờ sẽ có khóa
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09 cũng như các bí danh của nó là
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
244,
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
245 và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
246, tất cả đều trỏ đến bảng
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09

Tiếp theo, bạn sẽ xác định

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
248, có thể chuyển đổi bất kỳ đơn vị nào trong tệp TOML sang đơn vị cơ sở tương ứng của nó. Trong ví dụ này, đơn vị cơ sở luôn là
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09. Tuy nhiên, bạn có thể mở rộng bảng để bao gồm, ví dụ, các đơn vị độ dài với
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
250 làm đơn vị cơ sở của chúng

Thêm định nghĩa của

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
248 vào tệp của bạn

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
60

Bạn triển khai

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
248 dưới dạng hàm đệ quy. Nếu bảng tương ứng với
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
253 không chứa trường
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
224, thì bạn coi đơn vị đó là đơn vị cơ sở và trả về giá trị cũng như tên của nó. Mặt khác, nếu có trường ________ 1224, thì bạn chuyển đổi sang đơn vị tiếp theo trong chuỗi và gọi lại ________ 1248

Bắt đầu REPL của bạn. Sau đó, nhập

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
239 và chuyển đổi một vài số

>>>

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
61

Trong ví dụ đầu tiên,

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
258 được hiểu là
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09 vì đó là bí danh. Vì đây là đơn vị cơ sở, nên
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
260 được trả lại nguyên vẹn. Trong ví dụ thứ hai, ________ 1261 khiến hàm của bạn tra cứu trong bảng ________ 1262. Nó thấy rằng nó có thể chuyển đổi thành ________ 409 bằng cách nhân với ________ 1264

Chuỗi chuyển đổi có thể dài hơn

>>>

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
62

Để chuyển đổi

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
265 sang đơn vị cơ sở của nó, trước tiên, hàm của bạn chuyển đổi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
266 thành
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
267, sau đó chuyển đổi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
267 thành
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
262 và cuối cùng là chuyển đổi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
262 thành
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
09. Bạn thấy rằng có khoảng 1. 2 triệu giây trong mười bốn ngày và khoảng 2. 6 triệu giây trong một phần mười hai năm

Ghi chú. Trong ví dụ này, bạn sử dụng tệp TOML để lưu trữ thông tin về các đơn vị mà bộ chuyển đổi đơn vị của bạn hỗ trợ. Ngoài ra, bạn có thể đưa thông tin trực tiếp vào mã của mình bằng cách định nghĩa

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
272 là một từ điển theo nghĩa đen

Tuy nhiên, sử dụng tệp cấu hình mang lại một số lợi thế liên quan đến việc tách mã và dữ liệu

  • Logic của bạn được tách ra khỏi dữ liệu của bạn
  • Những người không phải là nhà phát triển có thể đóng góp cho bộ chuyển đổi đơn vị của bạn mà không cần chạm—hoặc thậm chí không biết về—mã Python
  • Với nỗ lực tối thiểu, bạn có thể hỗ trợ các tệp cấu hình đơn vị bổ sung. Người dùng có thể thêm những thứ này để bao gồm các đơn vị tùy chỉnh trong bộ chuyển đổi

Bạn nên xem xét việc thiết lập tệp cấu hình cho bất kỳ dự án nào mà bạn làm việc cùng

Như đã lưu ý trước đó,

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 dựa trên
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
219. Nếu bạn muốn phân tích các tài liệu TOML trong mã cần hỗ trợ các phiên bản Python cũ hơn, thì bạn có thể cài đặt
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
219 và sử dụng nó làm cổng sau của
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 như sau

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
63

Trên Python 3. 11, điều này nhập khẩu

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 như bình thường. Trên các phiên bản Python cũ hơn, quá trình nhập sẽ tăng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
278. Tại đây, bạn phát hiện lỗi và nhập
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
219 thay vào đó trong khi đặt bí danh cho tên
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 để phần còn lại của mã hoạt động không bị thay đổi

Bạn có thể tìm hiểu thêm về

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 trong Python 3. 11 Xem trước. TOML và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218. Hơn nữa, PEP 680 phác thảo các cuộc thảo luận dẫn đến việc
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
218 được thêm vào Python

Loại bỏ các quảng cáo

Các tính năng khá thú vị khác

Cho đến giờ, bạn đã biết về những thay đổi và cải tiến lớn nhất trong Python 3. 11. Tuy nhiên, có nhiều tính năng hơn để khám phá. Trong phần này, bạn sẽ xem qua một số tính năng mới có thể đang ẩn dưới các tiêu đề. Chúng bao gồm nhiều lần tăng tốc hơn, nhiều thay đổi hơn đối với các ngoại lệ và một cải tiến nhỏ đối với định dạng chuỗi

Khởi động nhanh hơn

Một kết quả thú vị khác của dự án Faster CPython là thời gian khởi động nhanh hơn. Khi bạn chạy tập lệnh Python, một số điều sẽ xảy ra khi trình thông dịch khởi tạo. Điều này khiến ngay cả chương trình đơn giản nhất cũng mất vài mili giây để chạy

  • các cửa sổ
  • Linux
  • hệ điều hành Mac

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
64

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
65

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
66

Bạn sử dụng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
284 để chuyển chương trình trực tiếp trên dòng lệnh. Trong trường hợp này, toàn bộ chương trình của bạn bao gồm một câu lệnh
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
285, câu lệnh này không làm gì cả

Trong nhiều trường hợp, thời gian để bắt đầu chương trình của bạn là không đáng kể so với thời gian để chạy mã của bạn. Tuy nhiên, trong các tập lệnh chạy ngắn hơn, như các ứng dụng dòng lệnh điển hình, thời gian khởi động có thể ảnh hưởng đáng kể đến hiệu suất chương trình của bạn

Để có một ví dụ cụ thể, hãy xem xét kịch bản sau—lấy cảm hứng từ chương trình cao bồi cổ điển

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
67

Trong

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
286, bạn đọc một tin nhắn từ dòng lệnh. Sau đó, bạn in tin nhắn trong bong bóng hội thoại kèm theo chú rắn dễ thương. Bây giờ, bạn có thể khiến con rắn nói bất cứ điều gì

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
68

Đây là một ví dụ cơ bản về ứng dụng dòng lệnh. Giống như nhiều ứng dụng dòng lệnh khác, nó chạy nhanh. Tuy nhiên, sẽ mất vài mili giây để chạy. Phần lớn chi phí này xảy ra khi Python nhập các mô-đun, thậm chí một số mô-đun mà bạn không tự nhập một cách rõ ràng

Bạn có thể sử dụng tùy chọn

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
287 để hiển thị tổng quan về thời gian nhập mô-đun

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
69

Các số trong bảng được đo bằng micro giây. Lưu ý định dạng của tên mô-đun trong cột cuối cùng. Cấu trúc cây chỉ ra rằng có một vài mô-đun cấp cao nhất và những mô-đun này nhập các mô-đun khác. Ví dụ:

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
288 là lần nhập cấp cao nhất, trong khi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
289 được nhập bởi
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
288

Ghi chú. Bạn đã sử dụng tùy chọn

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
291 ở trên. Theo tài liệu, điều này sẽ “vô hiệu hóa việc nhập mô-đun
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
292 và các thao tác phụ thuộc vào trang web của
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
293 mà nó đòi hỏi” [Nguồn]

Trong trường hợp của chương trình đơn giản này,

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
291 khiến chương trình chạy nhanh hơn vì cần ít lần nhập hơn. Tuy nhiên, đây không phải là cách tối ưu hóa mà bạn có thể sử dụng trong hầu hết các tập lệnh vì bạn sẽ không thể nhập bất kỳ thư viện bên thứ ba nào

Ví dụ đã được chạy trên Python 3. 11. Bảng sau đây so sánh những con số đó, tính bằng micro giây, với việc chạy cùng một lệnh với Python 3. 10

Mô-đun Python 3. 11Trăn 3. 10Tăng tốc

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
295157322551. 43x
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
2963585581. 56x
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
297261130091. 15x
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
2984174090. 98x
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
2991741730. 99x____128861612161. 97xTotal574976201. 33x

Các số của bạn sẽ khác, nhưng bạn sẽ thấy cùng một mẫu. Nhập nhanh hơn trên Python 3. 11 và điều này giúp các chương trình Python bắt đầu nhanh hơn

Một lý do lớn cho việc tăng tốc là cách lưu trữ và đọc mã byte được lưu trong bộ nhớ cache. Như bạn đã học, Python biên dịch mã nguồn của bạn thành mã byte do trình thông dịch chạy. Trong một thời gian dài, Python đã lưu mã bytecode đã biên dịch trong một thư mục có tên là

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
301 để tránh việc biên dịch lại không cần thiết

Nhưng trong phiên bản Python mới nhất, nhiều mô-đun được đóng băng và được lưu trữ theo cách giúp tải chúng vào bộ nhớ nhanh hơn. Bạn có thể đọc thêm về khởi động nhanh hơn trong tài liệu

Loại bỏ các quảng cáo

Ngoại lệ không tốn chi phí

Biểu diễn bên trong của các ngoại lệ là khác nhau trong Python 3. 11. Các đối tượng ngoại lệ nhẹ hơn và việc xử lý ngoại lệ đã thay đổi để có ít chi phí hoạt động trong khối

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302 …
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 miễn là mệnh đề
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 không được kích hoạt

Cái gọi là ngoại lệ chi phí bằng không được lấy cảm hứng từ các ngôn ngữ khác như C++ và Java. Mục tiêu là con đường hạnh phúc—khi không có ngoại lệ nào được nêu ra—sẽ hầu như miễn phí. Xử lý một ngoại lệ sẽ vẫn mất một thời gian

Các ngoại lệ không có chi phí được triển khai bằng cách yêu cầu trình biên dịch tạo các bảng nhảy khi mã nguồn của bạn được biên dịch thành mã byte. Các bảng này được tham khảo nếu một ngoại lệ được nêu ra. Nếu không có ngoại lệ, thì mã trong khối

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302 không có chi phí thời gian chạy

Nhớ lại ví dụ nghịch đảo nhân mà bạn đã làm việc với trước đó. Bạn thêm một chút xử lý lỗi

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
20

Nếu bạn cố gắng tính toán nghịch đảo của số 0, thì một

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
1 sẽ tăng lên. Trong triển khai mới của bạn, bạn gặp những lỗi này và in một thông báo mô tả. Như trước đây, bạn sử dụng
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
11 để xem mã byte bên trong

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
21

Bạn không cần phải hiểu chi tiết về bytecode. Tuy nhiên, bạn có thể so sánh các số ở cột ngoài cùng bên trái với các số dòng trong mã nguồn. Lưu ý rằng dòng 2, là

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
308, được dịch sang một lệnh
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
309 duy nhất. Đây là một hoạt động không có gì. Thú vị hơn, ở cuối phần tháo gỡ là một bảng ngoại lệ. Đây là bảng nhảy mà trình thông dịch sẽ sử dụng nếu nó cần xử lý một ngoại lệ

Trong Python 3. 10 trở về trước, có một chút xử lý ngoại lệ khi chạy. Ví dụ: một câu lệnh

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302 được biên dịch thành một lệnh
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
311 bao gồm một con trỏ tới khối ngoại lệ đầu tiên. Thay thế cái này bằng bảng nhảy sẽ tăng tốc các khối
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302 khi các ngoại lệ không được nêu ra

Các ngoại lệ không tốn phí rất phù hợp với kiểu mã dễ yêu cầu tha thứ hơn là cho phép, kiểu này thường sử dụng rất nhiều khối

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302 …
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303

Nhóm ngoại lệ

Trước đó, bạn đã tìm hiểu về các nhóm nhiệm vụ và cách chúng có thể xử lý nhiều lỗi cùng một lúc. Họ làm như vậy với một tính năng mới được gọi là nhóm ngoại lệ

Một cách để nghĩ về các nhóm ngoại lệ là chúng là các ngoại lệ thông thường bao bọc một số ngoại lệ thông thường khác. Tuy nhiên, trong khi các nhóm ngoại lệ hoạt động giống như các ngoại lệ thông thường ở nhiều khía cạnh, chúng cũng hỗ trợ cú pháp đặc biệt giúp bạn xử lý từng ngoại lệ được bao bọc một cách hiệu quả

Bạn tạo một nhóm ngoại lệ bằng cách cung cấp cho nó một mô tả và liệt kê các ngoại lệ mà nó kết thúc

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
22

Tại đây, bạn đã tạo một nhóm ngoại lệ với mô tả

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
315 bao bọc một
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
78 và một
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
317. Nếu một nhóm ngoại lệ được đưa ra mà không được xử lý, thì nó sẽ hiển thị một truy nguyên đẹp mắt minh họa việc nhóm và lồng các lỗi

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
23

Thông báo lỗi này chỉ ra rằng một nhóm ngoại lệ có hai ngoại lệ phụ đã được đưa ra. Mỗi ngoại lệ được bao bọc được hiển thị trong bảng điều khiển riêng của nó

Ngoài việc giới thiệu các nhóm ngoại lệ, phiên bản Python mới còn bổ sung cú pháp mới để làm việc hiệu quả với chúng. Bạn có thể thực hiện

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
318 và lặp lại từng lỗi trong
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
319. Tuy nhiên, điều này là cồng kềnh. Thay vào đó, bạn nên sử dụng từ khóa mới
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
24

Ngược lại với các câu lệnh

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 thông thường, một số câu lệnh
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320 có thể kích hoạt. Trong ví dụ này, cả
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
317 và
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
78 đều được xử lý

Các ngoại lệ chưa được xử lý bên trong một nhóm ngoại lệ sẽ dừng chương trình của bạn và hiển thị truy nguyên như bình thường. Lưu ý rằng các lỗi được xử lý bởi

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320 được lọc ra khỏi nhóm

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
25

Bạn xử lý

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
317, nhưng không chạm vào
$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
78. Điều này được phản ánh trong truy nguyên, trong đó nhóm ngoại lệ
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
328 hiện chỉ có một ngoại lệ phụ

Các nhóm ngoại lệ và cú pháp

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320 sẽ không thay thế các ngoại lệ thông thường và
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 đơn giản. Trên thực tế, có thể bạn sẽ không có nhiều trường hợp sử dụng để tự tạo các nhóm ngoại lệ. Thay vào đó, chúng hầu hết sẽ được nâng lên bởi các thư viện như
$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
37

Có thể bắt các ngoại lệ thông thường với

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320. Tuy nhiên, bạn muốn sử dụng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 đơn giản trong hầu hết các trường hợp và chỉ sử dụng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320 cho mã thực sự có thể tạo ra một nhóm ngoại lệ

Để tìm hiểu thêm về cách các nhóm ngoại lệ hoạt động, cách chúng có thể được lồng vào nhau và toàn bộ sức mạnh của

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320, hãy xem Python 3. 11 Xem trước. Nhóm nhiệm vụ và ngoại lệ. Irit Katriel, một trong những nhà phát triển cốt lõi của Python, đã trình bày các nhóm ngoại lệ tại Hội nghị thượng đỉnh ngôn ngữ Python vào năm 2021 và tại PyCon Vương quốc Anh vào năm 2022

Bạn có thể đọc thêm về động lực cho các nhóm ngoại lệ và các cuộc thảo luận dẫn đến việc triển khai hiện tại trong PEP 654

Loại bỏ các quảng cáo

Ghi chú ngoại lệ

Một phần mở rộng cho các ngoại lệ thông thường là khả năng thêm ghi chú tùy ý. PEP 678 mô tả cách các ghi chú này có thể được sử dụng để thêm thông tin vào một ngoại lệ trong một đoạn mã khác với đoạn mã đưa ra ngoại lệ ban đầu. Ví dụ: thư viện thử nghiệm như Giả thuyết có thể thêm thông tin về thử nghiệm nào không thành công

Bạn có thể thêm ghi chú vào bất kỳ ngoại lệ nào với

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
336 và xem các ghi chú hiện có bằng cách kiểm tra thuộc tính
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
337

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
26

Nếu xảy ra lỗi, thì mọi ghi chú liên quan sẽ được in ở cuối truy nguyên

Trong ví dụ sau, bạn đang gói vòng lặp chính của mình trong một khối

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302…
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 để thêm dấu thời gian cho lỗi. Điều này có thể hữu ích nếu bạn cần so sánh thông báo lỗi với nhật ký đang chạy cho chương trình của mình

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
27

Như bạn đã thấy trước đó, chương trình này tính toán nghịch đảo phép nhân. Tại đây, bạn đã thêm một hàm

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
53 ngắn mà sau này bạn gọi

Bạn đã kết thúc cuộc gọi tới

$ python inverse.py
Traceback [most recent call last]:
  File "/home/realpython/inverse.py", line 6, in 
    print[inverse[0]]
          ^^^^^^^^^^
  File "/home/realpython/inverse.py", line 4, in inverse
    return 1 / number
           ~~^~~~~~~~
ZeroDivisionError: division by zero
53 trong một khối
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
302…
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
303 bắt được bất kỳ
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
344 nào. Mặc dù bạn thường muốn cụ thể hơn, nhưng bạn sử dụng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
344 tại đây để thêm ngữ cảnh một cách hiệu quả vào bất kỳ ngoại lệ nào mà chương trình chính của bạn tình cờ phát sinh

Khi bạn chạy mã này, bạn sẽ thấy

>>> programmers[0]
{'name': {'first': 'Uncle Barry'}}

>>> Person.from_dict[programmers[0]]
Traceback [most recent call last]:
  File "/home/realpython/programmers.py", line 17, in from_dict
    name=f"{info['name']['first']} {info['name']['last']}",
                                    ~~~~~~~~~~~~^^^^^^^^
KeyError: 'last'
1 dự kiến. Ngoài ra, truy nguyên của bạn chứa dấu thời gian có thể giúp bạn trong nỗ lực gỡ lỗi của mình

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
28

Bạn có thể sử dụng cùng một mẫu để thêm thông tin hữu ích khác vào các ngoại lệ của mình. Xem Python 3 này. 11 xem trước và PEP 678 để biết thêm thông tin

Định dạng Zero âm

Một khái niệm kỳ lạ mà bạn có thể gặp phải khi thực hiện các phép tính với số dấu phẩy động là số 0 âm. Bạn có thể quan sát thấy số 0 âm và số 0 thông thường được hiển thị khác nhau trong REPL của bạn

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
29

Thông thường, chỉ có một số không, và nó không dương cũng không âm. Tuy nhiên, việc biểu diễn các số dấu phẩy động dễ dàng hơn khi cho phép các số 0 có dấu. Bên trong, các số được biểu diễn bằng dấu và độ lớn của chúng dưới dạng các đại lượng riêng biệt. Nó đơn giản hơn để biểu thị số 0 giống như bất kỳ số nào khác, với dấu dương hoặc dấu âm

Python biết rằng cả hai biểu diễn đều bằng nhau

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
0

Nói chung, bạn không cần phải lo lắng về số 0 âm trong phép tính của mình. Tuy nhiên, bạn có thể nhận được một số kết quả không mong muốn khi trình bày dữ liệu với các số âm nhỏ được làm tròn

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
1

Thông thường, khi một số được làm tròn thành 0, nó sẽ được biểu thị dưới dạng số 0 không dấu. Trong ví dụ này, số âm nhỏ được làm tròn đến hai chữ số thập phân khi được trình bày dưới dạng chuỗi f. Lưu ý rằng một dấu hiệu tiêu cực được hiển thị trước số không

PEP 682 giới thiệu một phần mở rộng nhỏ cho định dạng ngôn ngữ nhỏ được sử dụng bởi chuỗi f và

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
347. Trong Python 3. 11, bạn có thể thêm một chữ
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
348 vào chuỗi định dạng. Điều này sẽ buộc mọi số không được chuẩn hóa thành số không dương trước khi định dạng

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
2

Bạn đã thêm một

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
348 vào chuỗi định dạng.
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
350. Điều này đảm bảo rằng các số 0 âm không chuyển thành biểu diễn dữ liệu của bạn đối với người dùng

Loại bỏ các quảng cáo

hết pin

Một trong những điểm mạnh của Python trong những ngày đầu tiên là nó đi kèm với pin. Cụm từ hơi hoang đường này được sử dụng để chỉ ra rằng rất nhiều chức năng được bao gồm trong chính ngôn ngữ lập trình. Ví dụ: Python là một trong những ngôn ngữ sớm nhất bao gồm hỗ trợ cấp cao cho các vùng chứa như danh sách, bộ dữ liệu và từ điển

Tuy nhiên, pin thật có sẵn trong thư viện chuẩn của Python. Đây là tập hợp các gói đi kèm với mỗi lần cài đặt Python. Ví dụ, thư viện tiêu chuẩn bao gồm chức năng cho

  • Phân tích các loại và định dạng tệp khác nhau, như JSON và XML
  • Chạy một máy chủ web đơn giản
  • Soạn và gửi email
  • Giao tiếp với ổ cắm và các quy trình khác

Tổng cộng, thư viện tiêu chuẩn bao gồm hàng trăm mô-đun

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
3

Bạn có thể xem những mô-đun nào có sẵn trong thư viện tiêu chuẩn bằng cách kiểm tra

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
351. Có rất nhiều sức mạnh được tích hợp trong ngôn ngữ là một lợi ích cho Python trong những ngày đầu

Theo thời gian, tính hữu dụng của thư viện tiêu chuẩn đã giảm đi, chủ yếu là do việc phân phối và cài đặt các mô-đun của bên thứ ba trở nên thuận tiện hơn nhiều. Nhiều tính năng phổ biến nhất của Python hiện nằm ngoài bản phân phối chính. Các thư viện khoa học dữ liệu như NumPy và pandas, các công cụ trực quan hóa như Matplotlib và Bokeh cũng như các khung web như Django và Flask đều được phát triển độc lập

PEP 594 mô tả sáng kiến ​​loại bỏ pin chết khỏi thư viện tiêu chuẩn. Có ý kiến ​​cho rằng các module không còn phù hợp nên loại bỏ khỏi thư viện chuẩn. Điều này sẽ giúp những người bảo trì Python tập trung nỗ lực của họ vào nơi họ cần nhất và sẽ thu được lợi ích lớn nhất. Ngoài ra, thư viện tiêu chuẩn mỏng hơn giúp Python phù hợp hơn với các nền tảng thay thế như vi điều khiển hoặc trình duyệt

Không có mô-đun nào bị xóa khỏi thư viện chuẩn trong bản phát hành Python này. Thay vào đó, một số mô-đun ít được sử dụng được đánh dấu để xóa trong Python 3. 13. Các mô-đun được đề cập sẽ bắt đầu đưa ra cảnh báo trong Python 3. 11

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
4

Nếu mã của bạn bắt đầu đưa ra các loại cảnh báo này, thì bạn nên bắt đầu nghĩ đến việc viết lại mã của mình. Trong hầu hết các trường hợp, sẽ có một giải pháp thay thế hiện đại hơn. Ví dụ: nếu bạn hiện đang sử dụng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
352, thì bạn có thể viết lại mã của mình để sử dụng python-magic thay thế. Tại đây, bạn đang xác định loại tệp

>>>

$ python -i programmers.py
>>> Person.from_dict[programmers[2]]
Person[name='Grace Hopper', life_span=[1906, 1992]]
5

Cả thư viện cũ, không dùng nữa

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
352 và thư viện ma thuật python của bên thứ ba đều nhận ra rằng
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
354 đại diện cho một tệp hình ảnh JPEG

Ghi chú. Gói ma thuật python dựa trên thư viện C cần được cài đặt. Kiểm tra tài liệu để biết chi tiết về cách cài đặt nó trên hệ điều hành của bạn

Bạn có thể tìm thấy danh sách tất cả các mô-đun không dùng nữa trong pin chết PEP

Vì vậy, bạn có nên nâng cấp lên Python 3. 11?

Điều này kết thúc chuyến tham quan của bạn về những cải tiến thú vị nhất và các tính năng mới trong Python 3. 11. Một câu hỏi quan trọng là liệu bạn có nên nâng cấp lên phiên bản Python mới hay không. Và nếu vậy, khi nào là thời điểm tốt nhất để nâng cấp?

Như thường lệ với những loại câu hỏi này, câu trả lời to và rõ ràng tùy thuộc vào

Chiến thắng lớn nhất với Python 3. 11 là những cải tiến cho trải nghiệm của nhà phát triển. các thông báo lỗi tốt hơn và thực thi mã nhanh hơn. Đây là những khuyến khích tuyệt vời để nâng cấp môi trường mà bạn sử dụng để phát triển địa phương càng sớm càng tốt. Đây cũng là loại nâng cấp ít rủi ro nhất, vì bất kỳ lỗi nào bạn gặp phải đều có tác dụng hạn chế.

Tốc độ tăng lên cũng là một lý do tốt để cập nhật môi trường sản xuất của bạn. Tuy nhiên, như mọi khi, bạn nên cẩn thận khi cập nhật các môi trường nơi lỗi và lỗi có thể gây hậu quả nghiêm trọng. Đảm bảo bạn thực hiện kiểm tra thích hợp trước khi chạy công tắc. Là một phần của dự án Faster CPython, những thay đổi nội bộ trong phiên bản mới đã lớn hơn và rộng hơn bình thường. Pablo Galindo Salgado, người quản lý phát hành, nói về cách những thay đổi này ảnh hưởng đến quá trình phát hành trên podcast Real Python

Một vấn đề phổ biến với các bản phát hành mới là một số gói của bên thứ ba mà bạn phụ thuộc vào có thể chưa sẵn sàng cho bản phát hành mới vào ngày đầu tiên. Đối với Trăn 3. 11, các gói lớn như NumPy và SciPy bắt đầu đóng gói bánh xe cho 3. 11 trước khi phát hành. Hy vọng rằng bạn sẽ không phải đợi các phụ thuộc của mình sẵn sàng để nâng cấp vào khoảng thời gian này

Một khía cạnh khác của việc nâng cấp là khi nào bạn nên bắt đầu tận dụng cú pháp mới. Nếu bạn đang duy trì một thư viện hỗ trợ các phiên bản Python cũ hơn thì bạn không thể sử dụng

# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
355 hoặc cú pháp như
# inverse.py

def inverse[number]:
    return 1 / number

print[inverse[0]]
320 trong mã của mình. Tuy nhiên, thư viện của bạn sẽ nhanh hơn đối với bất kỳ ai sử dụng Python 3. 11

Thay vào đó, nếu bạn đang tạo một ứng dụng mà bạn kiểm soát môi trường ứng dụng đang chạy trong đó, thì bạn sẽ có thể sử dụng các tính năng mới ngay sau khi nâng cấp môi trường

Loại bỏ các quảng cáo

Sự kết luận

Một bản phát hành mới của Python luôn là lý do để ăn mừng và ghi nhận tất cả những nỗ lực mà các tình nguyện viên từ khắp nơi trên thế giới đã đổ vào ngôn ngữ này

Trong hướng dẫn này, bạn đã thấy các tính năng và cải tiến mới như

  • Thông báo lỗi tốt hơn với nhiều truy nguyên thông tin hơn
  • Thực thi mã nhanh hơn do nỗ lực đáng kể trong dự án Faster CPython
  • Các nhóm tác vụ và ngoại lệ giúp đơn giản hóa công việc với mã không đồng bộ
  • Một số tính năng gõ mới giúp cải thiện khả năng hỗ trợ gõ tĩnh của Python
  • Hỗ trợ TOML gốc để làm việc với các tệp cấu hình

Bạn có thể không tận dụng được tất cả các tính năng ngay lập tức. Tuy nhiên, bạn nên thử kiểm tra mã của mình trên Python 3. 11 để đảm bảo mã của bạn sẵn sàng cho tương lai. Bạn có nhận thấy bất kỳ tăng tốc?

Tải xuống miễn phí. Nhấp vào đây để tải xuống mã mẫu miễn phí thể hiện một số tính năng mới của Python 3. 11

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Các tính năng mới thú vị trong Python 3. 11

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Geir Arne Hjelle

Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python

» Thông tin thêm về Geir Arne

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

kate

Martin

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Tính năng nào sau đây là tính năng kết nối tiêu chuẩn cho 2023 Kicks?

Công nghệ kết nối Nissan Kicks® 2023 .
TÍCH HỢP APPLE CARPLAY®. Kết nối liền mạch mọi thứ bạn yêu thích trên iPhone® tương thích của bạn với Kicks bằng Apple CarPlay®
NISSANCONNECT® VỚI ĐIỂM PHÁT SÓNG WI-FI. .
DỊCH VỤ NISSANCONNECT® DO SIRIUSXM CUNG CẤP

Đèn pha tự động thông minh kicks 2022 có những chức năng gì?

Hệ thống có hai chức năng. Phát hiện chạng vạng tự động bật đèn pha khi ánh sáng xung quanh bắt đầu giảm;

Lợi ích của 2023 Kicks có sẵn khởi động động cơ từ xa với kiểm soát khí hậu thông minh là gì?

KIỂM SOÁT KHÍ HẬU BÊN TRONG . warm up or cool down your Kicks before you even get in, based on the temperature outside.

Tính năng kết nối nào sau đây là tiêu chuẩn cho 2022 kicks?

Những người mua trẻ tuổi mong đợi công nghệ giúp họ luôn kết nối, vì vậy, Kicks có Apple CarPlay® và Android Auto™ tiêu chuẩn trên tất cả các hạng của Kicks 2022, như .

Chủ Đề