Hướng dẫn dùng python 3.10.1 python

Hướng dẫn dùng python 3.10.1 python
Photo: morioh.com

Ngày phát hành Python 3.10 đang đến gần, dự tính là tháng 05 2021. Vì vậy đã đến lúc sử dụng phiên bản của ngôn ngữ lập trình Python mới và xem những tính năng mới tuyệt vời nào sẽ đi kèm với bản phát hành mới này.

Nội dung

  • Cài đặt phiên bản Python 3.10 Alpha
  • Các tính năng mới của Python 3.10
    • Kiểu toán tử Union
    • TypeAlias Annotation
  • Thông báo lỗi tốt hơn trong trình phân tích cú pháp
    • Đối sánh mô hình cấu trúc (Structural Pattern Matching)
    • Cải thiện hiệu suất
  • Kết luận
    • Bài viết liên quan

Cài đặt phiên bản Python 3.10 Alpha

Để thử các tính năng mới này, chúng tôi sẽ phải cài đặt phiên bản Alpha / Beta của Python 3.10. Hãy nhớ rằng phiên bản cuối cùng này vẫn chưa ổn định.

  • Nếu bạn đang sử dụng Linux (Ubuntu), bạn cần làm theo các bước dưới đây:
# Download the latest version for Linux
 wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0a6.tgz
 # Unpack Python source code
 tar xzvf Python-3.10.0a6.tgz
cd Python-3.10.0a6
# Compile Python source with static libraries
./configure --prefix=$HOME/python-3.10.0a6
make
make install
$HOME/python-3.10.0a6/bin/python3.10
  • Nếu bạn đang sử dụng Windows, bạn chỉ cần tải xuống Trình cài đặt thực thi Python tại đây, sau đó bạn cần chạy Run Executable Installer.
  • Nếu bạn đang sử dụng MacO, liên kết này có thể giúp bạn.

Python 3.10 cuối cùng đã được cài đặt , bây giờ chúng ta có thể xem qua tất cả các tính năng mới. Hãy bắt đầu

Phiên bản mới của python có nhiều tính năng mới. Bài viết này chỉ đưa ra một số tính năng quan trọng nhất trong số đó:

Kiểu toán tử Union

Phiên bản cũ

from typing import Union
def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2
isinstance('3', int | str)

Phiên bản mới

def square(number: int | float) -> int | float:
    return number ** 2
isinstance('3', int | str)

Tính năng này được đóng góp bởi Ken Jin. Truy cập liên kết này (PEP 612) để biết thêm chi tiết.

TypeAlias Annotation

Khái niệm chú thích (Annotation) TypeAlias lần đầu tiên được giới thiệu trong PEP 484 (Phiên bản Python 3.5). Việc hoàn thiện lại khái niệm này sẽ được trình bày trong PEP 613 (Phiên bản Python: 3.10). Lý do chính cho việc thực hiện lại này là khái niệm cũ rất khó cho người kiểm tra kiểu phân biệt giữa bí danh kiểu (type aliases) và phép gán thông thường. Xem ví dụ sau:

Phiên bản cũ

StrCache = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant

Phiên bản mới

StrCache: TypeAlias = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant

Tính năng này được đóng góp bởi Mikhail Golubev. Truy cập liên kết này (PEP 613) để biết thêm chi tiết.

Thông báo lỗi tốt hơn trong trình phân tích cú pháp

Giả sử bạn viết dictionay (hoặc tuple, list hoặc set) và bạn quên đóng dấu ngoặc (hoặc dấu ngoặc đơn). Nếu bạn đang làm việc với python 3, khi bạn thực thi code và trình thông dịch sẽ hiển thị lỗi cú pháp như lỗi “SyntaxError : unexpected EOF”.
Tuy nhiên, với phiên bản mới Pythong 3.10 này, khi bạn cố gắng phân tích cú pháp mã có chứa dấu ngoặc đơn hoặc dấu ngoặc vuông, trình thông dịch sẽ hiển thị lỗi nhiều thông tin hơn với vị trí của dấu ngoặc đơn hoặc dấu ngoặc vuông.

Phiên bản cũ

File "example.py", line 3
some_other_code = foo()
                ^
SyntaxError: invalid syntax

Phiên bản mới

File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
           ^
SyntaxError: '{' was never closed

Tính năng này được đóng góp bởi Pablo Galindo và Batuhan Taskaya

Đối sánh mô hình cấu trúc (Structural Pattern Matching)

Có thể nói rằng tính năng này là quan trọng nhất được giới thiệu trong Python 3.10.

So khớp mẫu (Pattern matching) sẽ được trình bày dưới dạng chung: câu lệnh so khớp và câu lệnh trường hợp (match statement & case statements) của các mẫu với các hành động liên kết. Các mẫu có thể là: chuỗi, ánh xạ, kiểu dữ liệu nguyên thủy cũng như các class instances. Ví dụ: bằng cách sử dụng đối sánh mẫu, chúng tôi có thể trích xuất thông tin từ các kiểu dữ liệu phức tạp, đưa vào cấu trúc dữ liệu và áp dụng các hành động cụ thể dựa trên các biểu mẫu dữ liệu khác nhau. Đây không chỉ là cú pháp switch / case mà chúng ta đều biết từ các ngôn ngữ lập trình khác, mà nó còn bổ sung thêm chức năng mạnh mẽ khác.

Ví dụ 1: Mẫu đơn giản – khớp với một chữ

ef func(x):
    match x:
        case "x1":
            return "x1 .."
        case "x2":
            return "x2"
        case "x3" | "x4":  # Multiple literals can be combined with `|`
            return "Yay, "
        case _:
            return "Just another x..."

Ví dụ 2: Các mẫu có chữ và biến

def func(X):  # X = (x, y, z)
    # point is an (x, y) tuple
    match point:
        case (0, 0):
            print("Origin")
        case (0, y):
            print(f"Y={y}")
        case (x, 0):
            print(f"X={x}")
        case (x, y):
            print(f"X={x}, Y={y}")
        case _:
            raise ValueError("Not a point")

Ví dụ 3: Các mẫu và lớp

class Point:
    x: int
    y: int

    def location(point):
        match point:
            case Point(x=0, y=0):
                print("Origin is the point's location.")
            case Point(x=0, y=y):
                print(f"Y={y} and the point is on the y-axis.")
            case Point(x=x, y=0):
                print(f"X={x} and the point is on the x-axis.")
            case Point():
                print("The point is located somewhere else on the plane.")
            case _:
                print("Not a point")

Ví dụ 4: Guard (bảo vệ)

Chúng ta có thể thêm mệnh đề if vào một mẫu, được gọi là Guard. Nếu lệnh guard là sai, match sẽ tiếp tục để thử khối tiếp theo. Lưu ý rằng việc thu thập giá trị diễn ra trước khi đánh giá guard:

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")

Ví dụ 5: Các mẫu lồng nhau

Các mẫu có thể được lồng vào nhau theo những cách tùy ý. Ví dụ: nếu dữ liệu của chúng ta là một danh sách ngắn các điểm, chúng có thể được đối sánh theo cách sau:

match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point {x}, {y} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
    case _:
        print("Something else is found in the list.")

Nếu bạn muốn xem thêm các ví dụ và hướng dẫn đầy đủ, hãy xem PEP 636.

Cải thiện hiệu suất

Giống như các bản phát hành gần đây của Python, Python 3.10 cũng mang lại một số cải tiến về hiệu suất. Trước hết là tối ưu hóa các hàm tạo str (), byte () và bytearray (), sẽ nhanh hơn khoảng 30% (đoạn code được điều chỉnh từ ví dụ về trình theo dõi lỗi Python):

~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "str()"
Mean +- std dev: [python] 81.9 ns +- 4.5 ns -> [python3.10] 60.0 ns +- 1.9 ns: 1.36x faster (-27%)
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytes()"
Mean +- std dev: [python] 85.1 ns +- 2.2 ns -> [python3.10] 60.2 ns +- 2.3 ns: 1.41x faster (-29%)
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytearray()"
Mean +- std dev: [python] 93.5 ns +- 2.1 ns -> [python3.10] 73.1 ns +- 1.8 ns: 1.28x faster (-22%)

Một tối ưu hóa đáng chú ý khác (nếu bạn đang sử dụng type annotations) là các tham số hàm và chú thích của chúng không còn được tính toán trong thời gian chạy nữa mà thay vào đó là tại thời điểm biên dịch. Điều này hiện giúp việc tạo một hàm có chú thích tham số nhanh hơn khoảng 2 lần.

Trên hết, có một số tối ưu hóa hơn trong các phần khác nhau của lõi Python. Bạn có thể tìm thấy chi tiết cụ thể về những vấn đề đó trong các sự cố sau trong trình theo dõi lỗi Python:  bpo-41718, bpo-42927 và bpo-43452.

Kết luận

Python 3.10 mang đến nhiều tính năng thú vị mới, nhưng vì nó là phiên bản alpha (chưa ổn định) nên vẫn còn lâu mới được thử nghiệm đầy đủ và sẵn sàng đưa vào sử dụng. Vì vậy, không được khuyến khích để bắt đầu sử dụng ngay nhưng bạn có thể khám phá các tính năng mới của phiên bản này.

Bạn có thể xem tất cả những tính năng mới của Python 3.10 tại đây

Theo:

1/https://dev.to/thrpy/python-3-10-what-s-the-new-4a61

2/https://towardsdatascience.com/all-the-important-features-and-changes-in-python-3-10-e3d1fe542fbf