Các tính năng Python mới nhất

Các tính năng Python mới nhất

Bài viết này giải thích các tính năng mới nhất của Python.

Chúng tôi sẽ giải thích từng bước các tính năng nổi bật của Python thế hệ 3.12 đến 3.13 từ góc nhìn thực tiễn, chú trọng vào các ứng dụng có thể sử dụng ngay.

YouTube Video

Các tính năng Python mới nhất

Những năm gần đây, Python đã phát triển không chỉ chú trọng vào 'dễ viết' mà còn cả 'tính ổn định, tốc độ và khả năng dễ đọc'. Dưới đây, chúng tôi sẽ giới thiệu các tính năng nổi bật từ các phiên bản Python 3.12 đến 3.13.

Cải tiến lớn trong thông báo lỗi (Python 3.12)

Trong Python 3.12, các lỗi hiện được hiển thị một cách cụ thể và trực quan hơn. Bạn có thể xác định ngay vị trí mắc lỗi và giảm đáng kể thời gian gỡ lỗi.

1def calc_total(price, tax):
2    return price + price * tax
3
4result = calc_total(100, )
  • Các tham số bị thiếu được hiển thị cùng dòng và vị trí liên quan, giúp bạn không bị nhầm lẫn khi xác định nguyên nhân.

Ứng dụng thực tế của lệnh 'match' (So khớp mẫu cấu trúc)

Lệnh 'match' cho phép bạn mô tả các nhánh điều kiện phức tạp và phân biệt cấu trúc dữ liệu một cách khai báo. Việc xử lý từ điển và các cấu trúc lồng nhau trở nên dễ đọc hơn rất nhiều.

1user = {"status": "active", "name": "Alice"}
2
3match user:
4    case {"status": "active", "name": name}:
5        print(f"Welcome back, {name}!")
6    case {"status": "inactive"}:
7        print("Please activate your account.")
8    case _:
9        print("Unknown user status.")
  • Vì bạn có thể đồng thời thực hiện phân nhánh điều kiện và trích xuất dữ liệu, nên không còn cần thiết lồng nhiều câu lệnh if.

So khớp mẫu trực quan để xử lý dữ liệu lồng nhau

Lệnh 'match' cũng rất hiệu quả cho các dữ liệu có cấu trúc như JSON hoặc phản hồi từ API.

1data = {"user": {"name": "Bob", "age": 25}}
2
3match data:
4    case {"user": {"name": name, "age": age}}:
5        print(f"{name} is {age} years old.")
  • Bạn có thể trích xuất an toàn chỉ các phần tử cần thiết, giảm nhu cầu phải viết mã phòng thủ.

Nâng cao khả năng hiển thị debug với f-string (ký hiệu =` / Python 3.8 trở đi, cải thiện tính tiện dụng)

Với f-string, giờ đây bạn có thể thêm ký hiệu = để hiển thị đồng thời biểu thức và kết quả đánh giá của nó. Tính năng này chuyên biệt cho việc debug và cực kỳ hữu ích khi bạn muốn kiểm tra nhanh nội dung của biến.

1x = 10
2y = 20
3print(f"{x=}, {y=}, {x+y=}")
  • Vì tên biến và giá trị của chúng được hiển thị cùng nhau, việc debug tạm thời bằng câu lệnh print() trở nên dễ đọc hơn.
  • Bạn có thể viết mã log và kiểm tra (verification) một cách ngắn gọn và rõ ràng hơn.

Đơn giản hóa gợi ý kiểu (Type Hints) và bí danh 'type' (Python 3.12: Cú pháp bí danh type mới)

Trong Python 3.12, có thêm cú pháp riêng để định nghĩa bí danh kiểu—câu lệnh type. Điều này giúp gợi ý kiểu không chỉ là thông tin bổ sung mà còn như một thành phần ngôn ngữ để thể hiện rõ ý đồ thiết kế.

1type UserId = int
2type UserName = str
3
4def greet(user_id: UserId, name: UserName) -> str:
5    return f"Hello, {name} (id={user_id})"
  • Lúc này, khi gán ý nghĩa cho UserId hoặc UserName, sự khác biệt về vai trò được làm rõ dù cả hai dùng cùng kiểu int hoặc str.
  • Định nghĩa kiểu trở nên ngắn gọn hơn, giảm chi phí hiểu mã trong quá trình kiểm tra và bảo trì.
  • Trước đây, bí danh kiểu như UserId = int được tạo qua phép gán, nhưng dùng lệnh type sẽ làm rõ ràng 'đây là một định nghĩa kiểu'. Cách làm này đặc biệt hiệu quả để cải thiện độ rõ ràng trong thiết kế với các dự án vừa và lớn.

Chú thích kiểu tự nhiên bằng loại tích hợp sẵn (Đơn giản hóa generics từ Python 3.9 trở đi)

Từ Python 3.9, bạn có thể dùng trực tiếp các kiểu tích hợp như list hay dict làm generics.

Điều này cho phép bạn viết gợi ý kiểu trực quan, dễ đọc mà không cần import kiểu từ module typing.

1def sum_numbers(numbers: list[int]) -> int:
2    return sum(numbers)
3
4print(sum_numbers([1, 2, 3, 4]))
  • Gợi ý kiểu hoạt động không phải như 'ràng buộc', mà như 'tài liệu giải thích nội dung xử lý'.

Kết chuỗi phương thức an toàn với kiểu Self (Python 3.11 trở đi)

Từ Python 3.11, bạn có thể chỉ định Self làm kiểu trả về cho phương thức trả về chính lớp đó.

Nhờ đó bạn có thể viết mã kết chuỗi phương thức an toàn mà không bị mất thông tin kiểu.

 1from typing import Self
 2
 3class Counter:
 4    def __init__(self, value: int = 0) -> None:
 5        self.value = value
 6
 7    def increment(self) -> Self:
 8        self.value += 1
 9        return self
10
11counter = Counter()
12counter.increment().increment()
13print(counter.value)
  • Ngay cả với phương thức trả về self, kiểu trả về chính xác cũng được giữ nguyên.
  • IDE và các công cụ kiểm tra kiểu có thể hiểu chính xác việc kết chuỗi phương thức.

Xử lý chuỗi rõ ràng hơn (removeprefix / removesuffix | Python 3.9 trở đi)

Từ Python 3.9, đã bổ sung các phương thức chuyên biệt str.removeprefix()str.removesuffix() để loại bỏ an toàn tiền tố và hậu tố trên chuỗi. Nhờ các phương thức này, bạn có thể diễn đạt chính xác ý định 'chỉ loại bỏ phần đầu hoặc cuối' trong mã.

1filename = "report_2026.txt"
2
3clean_name = filename.removeprefix("report_")
4name_without_ext = clean_name.removesuffix(".txt")
5
6print(name_without_ext)
  • Chuỗi được chỉ định sẽ bị loại bỏ chỉ khi nó xuất hiện ở đầu hoặc cuối, tránh những thay thế không mong muốn.
  • Cách này mang lại khả năng đọc và độ an toàn cao hơn so với việc dùng replace() hoặc cắt chuỗi (slicing).
  • Đặc biệt khi xử lý 'chuỗi có định dạng xác định' như tên file hay tiền xử lý URL, sử dụng các phương thức này giúp giảm thiểu đáng kể nguy cơ lỗi.

So sánh chuỗi mạnh mẽ phục vụ đa ngôn ngữ (str.casefold() | Hỗ trợ Unicode)

str.casefold() trong Python là một phương thức dùng để so sánh không phân biệt hoa thường có xét đến Unicode. Khác với lower() hay upper(), phương thức này chuẩn hóa chuỗi, bao gồm cả chuyển đổi ký tự đặc thù ngôn ngữ.

1text1 = "Stra\u00dfe"
2text2 = "strasse"
3
4print(text1)
5print(text2)
6
7print(f"Comparison Result: {text1.casefold() == text2.casefold()}")
  • Nó có thể xử lý đúng sự khác biệt phụ thuộc ngôn ngữ như tiếng Đức giữa ßss.
  • Đây là kỹ thuật thiết yếu cho các ứng dụng có hỗ trợ đa ngôn ngữ hoặc quốc tế hóa.

Hỗ trợ TOML tiêu chuẩn (tomllib | Python 3.11 trở đi)

Từ Python 3.11 trở đi, module tomllib để đọc file cấu hình TOML đã được thêm vào thư viện chuẩn. Quản lý cấu hình giờ có thể thực hiện hoàn toàn trong Python mà không cần phụ thuộc vào thư viện ngoài.

 1import tomllib
 2
 3with open("config.toml", "rb") as f:
 4    config = tomllib.load(f)
 5
 6print(config["database"]["host"])
 7
 8# config.toml
 9# title = "TOML Example"
10# [database]
11# host = "192.168.1.1"
12# ports = [ 8001, 8001, 8002 ]
  • Không còn cần các package ngoài như toml, giúp đơn giản hóa phụ thuộc trong dự án.
  • Việc nạp file cấu hình được chuẩn hóa, giúp dễ dàng hơn trong phân phối, vận hành và môi trường CI.

Xử lý ngoại lệ cho thời đại xử lý song song (ExceptionGroup / except* | Python 3.11 trở đi)

Python 3.11 giới thiệu ExceptionGroup để xử lý nhiều ngoại lệ cùng lúc và cú pháp except* để xử lý phân nhánh an toàn. Đây là tính năng mới để xử lý 'lỗi đồng thời' xuất hiện trong xử lý bất đồng bộ hoặc song song.

 1def process(values):
 2    errors = []
 3    for v in values:
 4        if v < 0:
 5            errors.append(ValueError(f"Negative value: {v}"))
 6    if errors:
 7        raise ExceptionGroup("Invalid values", errors)
 8
 9try:
10    process([1, -2, -3])
11except* ValueError as e:
12    print("Handled:", e)
  • Nhiều ngoại lệ giờ có thể phát sinh và phân loại chỉ trong một thao tác.
  • Tính năng này giải quyết vấn đề trước đây trong xử lý bất đồng bộ chỉ phát hiện được lỗi đầu tiên.
  • Với các thao tác như asyncio.gather() hay xử lý lô song song, có thể xảy ra đồng thời nhiều nguyên nhân gây lỗi. Việc dùng ExceptionGroup giúp dễ dàng tổ chức việc thu thập lỗi, ghi log và xây dựng chiến lược thử lại.

Hiệu suất được cải thiện chỉ bằng cách cập nhật lên phiên bản mới nhất

Từ Python 3.11 trở đi, nhiều tiến trình đã được tăng tốc nhờ tối ưu hóa bên trong.

1def count_up(n):
2    total = 0
3    for i in range(n):
4        total += i
5    return total
6
7print(count_up(1_000_000))
  • Điểm lợi lớn là bạn có thể cải thiện tốc độ mà không cần viết lại mã nguồn.

Kiểm soát thu gom rác (quản lý rõ ràng qua module gc)

Trong Python, sử dụng module gc chuẩn cho phép bạn tạm thời vô hiệu hóa hoặc thực thi thu gom rác bằng tay. Đây là một kỹ thuật tối ưu hiệu quả trong các kịch bản như xử lý lô dữ liệu lớn hoặc các thao tác yêu cầu hiệu suất cao.

1import gc
2
3gc.disable()
4# heavy batch processing
5gc.enable()
6gc.collect()
  • Kìm hãm việc thu gom rác không cần thiết có thể giảm sự dao động của thời gian xử lý.
  • Bạn có thể chủ động thu gom rác vào các khoảng thời gian nhất định, giúp dễ theo dõi việc sử dụng bộ nhớ.
  • Tuy nhiên, kỹ thuật này không nên dùng làm mặc định mà chỉ nên áp dụng khi việc phân tích cho thấy GC là điểm nghẽn. Với hầu hết ứng dụng, an toàn nhất vẫn là dựa vào hệ thống thu gom rác tự động của Python.

Tóm tắt

Nhờ các cải tiến trong thông báo lỗi và phát triển của type hints ở Python 3.12 đến 3.13, việc hiểu và duy trì mã nguồn trở nên dễ hơn bao giờ hết. Ngoài ra, các cải tiến như trải nghiệm debug tốt hơn và tăng hiệu suất nhờ tối ưu hóa bên trong đang góp phần trực tiếp nâng cao hiệu quả công việc thực tế. Bạn không cần phải sử dụng tất cả các tính năng mới này cùng lúc; thực tế nên bắt đầu với phiên bản Python mới nhất và từng bước áp dụng các tính năng khi cần. Cách áp dụng dần này giúp mã Python trở nên dễ đọc và ổn định hơn.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video