Kiểm tra Null trong Python: Sử dụng None và Các Thực hành Tốt nhất

1. Giới thiệu

Khi viết chương trình bằng Python, việc “kiểm tra null” là rất quan trọng để xác nhận dữ liệu không tồn tại hoặc để xử lý lỗi. Trong Python, một giá trị đặc biệt tương ứng với “null” trong các ngôn ngữ khác, None, được cung cấp và được sử dụng trong nhiều tình huống.
Bài viết này giải thích cách thực hiện “kiểm tra null” và cách sử dụng chúng một cách hiệu quả từ góc nhìn của Python. Nó được viết để dễ hiểu cho người mới bắt đầu và nhằm cung cấp nội dung có thể áp dụng trong phát triển thực tế, vì vậy hãy sử dụng nó như một tài liệu tham khảo.

2. “null” là gì trong Python?

Các ngôn ngữ lập trình có một giá trị đặc biệt đại diện cho việc không có dữ liệu hoặc trạng thái không hợp lệ. Ví dụ, JavaScript và Java sử dụng “null”, và PHP sử dụng “NULL”, nhưng trong Python giá trị này được gọi là “None”.

Các khái niệm cơ bản về None trong Python

None của Python tương ứng với “null” trong các ngôn ngữ khác và cho biết dữ liệu không tồn tại hoặc chưa được đặt cụ thể. Trong Python, mọi dữ liệu đều được coi là đối tượng, và None cũng không ngoại lệ — nó là một đối tượng của kiểu đặc biệt NoneType.
Ví dụ, bằng cách gán None cho một biến như dưới đây, bạn cho biết không có dữ liệu nào được đặt.

x = None

Điều này làm cho việc biến x không có giá trị được gán trở nên rõ ràng.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Cách sử dụng cơ bản của None

Trong Python, None được sử dụng trong nhiều tình huống để chỉ rõ một trạng thái nhất định. Ở đây chúng ta sẽ giới thiệu cách sử dụng cơ bản của None.

Gán None cho một biến

Gán None cho một biến cho biết nó “không chứa giá trị” hoặc “chưa được đặt”. Điều này được dùng cho dữ liệu chưa được quyết định hoặc cho các biến mà bạn muốn tạm thời để trống.

name = None
age = None

Các hàm trả về None

Khi một hàm không thực sự cần giá trị trả về, hoặc bạn muốn chỉ ra “không trả gì” trong một số điều kiện, việc trả về None là phổ biến. Ví dụ, trong một hàm như dưới đây bạn có thể trả về None khi điều kiện không được đáp ứng.

def find_even_number(numbers):
    for num in numbers:
        if num % 2 == 0:
            return num
    return None

Hàm này tìm và trả về một số chẵn, nhưng nếu không tìm thấy nào thì nó trả về None để chỉ ra rằng không có dữ liệu phù hợp.

4. Cách xác định None

Trong Python, cách phổ biến để kiểm tra xem có phải là None hay không là sử dụng toán tử is. Đặc biệt, toán tử is rất đáng tin cậy để kiểm tra None và được khuyến nghị bởi hướng dẫn phong cách Python chính thức (PEP 8). Toán tử == cũng có thể được dùng, nhưng vì nó hoạt động khác nhau nên bạn cần cẩn thận. Phần này sẽ giải thích từng phương pháp kiểm tra.

Cách kiểm tra bằng toán tử is

Toán tử is là cách chuẩn trong Python để kiểm tra một biến có phải là None hay không. is kiểm tra tính đồng nhất của đối tượng, vì vậy nó phù hợp để xác định None. Hãy xem ví dụ dưới đây.

x = None
if x is None:
    print("x is None")

Trong đoạn mã này, nếu biến xNone, nó sẽ in ra “x is None”. Sử dụng toán tử is làm cho mã rõ ràng và dễ đọc hơn, vì vậy đặc biệt nên dùng is để kiểm tra None.

Sự khác biệt và lưu ý khi sử dụng toán tử ==

Trong Python, bạn cũng có thể dùng toán tử == để kiểm tra None, nhưng == được dùng để so sánh “giá trị bằng nhau”. Nó cũng hoạt động để kiểm tra None, nhưng đôi khi có thể cho ra kết quả không mong muốn, vì vậy tốt hơn nên dùng is khi kiểm tra None.

x = None
if x == None:  # Works, but not recommended
    print("x is None")

Kiểm tra trường hợp phủ định (is not)

Nếu bạn muốn xác nhận một biến không phải là None, hãy dùng toán tử is not. is not tiện lợi để chỉ định hành động khi một biến không phải là None.

x = 5
if x is not None:
    print("x is not None")

Trong ví dụ này, nếu x không phải là None, nó sẽ in ra “x is not None”. Sử dụng toán tử is not như vậy cho phép kiểm tra một cách rõ ràng các điều kiện mà một đối tượng không phải là None.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. Sự khác nhau giữa None và các giá trị falsy khác

Trong Python, có một số giá trị ngoài None được đánh giá là “falsy”. Chúng bao gồm chuỗi rỗng '', giá trị số 0, danh sách rỗng [], v.v. Tuy nhiên, những giá trị này khác với None. Ở đây chúng ta sẽ đi sâu vào sự khác nhau giữa None và các giá trị falsy khác.

Tổng quan về None và các giá trị falsy khác

Các giá trị chính được đánh giá là falsy trong Python là:

  • None
  • chuỗi rỗng ''
  • số 0
  • danh sách rỗng []
  • từ điển rỗng {}

Tất cả các giá trị này được đánh giá là False, nhưng None, khác với chúng, đại diện cho sự thiếu vắng một giá trị.

Sự khác nhau giữa None và chuỗi rỗng ''

Chuỗi rỗng '' cho biết dữ liệu là trống trong khi vẫn giữ kiểu dữ liệu str. Ngược lại, None là một đối tượng đặc biệt không có kiểu. Hãy xem ví dụ sau.

text = ''
if text is None:
    print("text is None")
elif text == '':
    print("text is an empty string")

Đoạn mã này phân biệt liệu text có phải là chuỗi rỗng hay None và xử lý từng trường hợp tương ứng.

Sự khác nhau so với số 0 và danh sách rỗng []

Số 0 và danh sách rỗng [] cũng được đánh giá là False, nhưng chúng cho thấy có một giá trị số hoặc danh sách nhưng nội dung của chúng trống. None, không có kiểu, có nghĩa là không có gì được đặt. Hãy xác nhận bằng ví dụ sau.

data = 0
if data is None:
    print("data is None")
elif data == 0:
    print("data is 0")

Hiểu được sự khác nhau giữa None và các giá trị falsy khác sẽ cho phép kiểm tra chính xác hơn.

6. Các ví dụ thực tế về việc sử dụng None

Ở đây chúng tôi giải thích một số ví dụ cụ thể về cách sử dụng None một cách hiệu quả trong các chương trình Python. None được sử dụng rộng rãi cho các đối số mặc định, xử lý dữ liệu lấy từ cơ sở dữ liệu, xử lý lỗi, và hơn thế nữa. Hiểu các ví dụ này giúp cải thiện khả năng bảo trì và độ dễ đọc của mã.

Sử dụng None làm đối số mặc định của hàm

Bằng cách đặt None làm đối số mặc định của hàm, việc thiết kế hàm linh hoạt trở nên khả thi. Ví dụ, nếu một đối số không được truyền vào hàm, bạn có thể dùng None để xác định điều này và thiết lập hành vi mặc định dựa trên các điều kiện.

def greet(name=None):
    if name is None:
        print("Hello, Guest!")
    else:
        print(f"Hello, {name}!")

Hàm greet này hiển thị “Hello, Guest!” khi đối số name không được cung cấp, và khi có thì chào bằng tên đã chỉ định. Bằng cách tận dụng None như vậy, bạn có thể dễ dàng tạo các hàm có hành vi linh hoạt.

Xử lý None khi lấy dữ liệu từ cơ sở dữ liệu

Khi lấy dữ liệu từ cơ sở dữ liệu, None có thể được trả về khi dữ liệu không tồn tại. Ví dụ, các giá trị NULL trong SQL thường được chuyển trực tiếp thành None, và bạn thực hiện các kiểm tra None để xác định dữ liệu có bị thiếu hay không.

user_data = get_user_data(user_id)  # Function to retrieve user data
if user_data is None:
    print("No user data found")
else:
    print("Displaying user data")

Ở đây, nếu hàm get_user_data không trả về dữ liệu người dùng, nó sẽ trả về None, và trong trường hợp đó sẽ hiển thị “No user data found”. Thực hiện các kiểm tra None như vậy làm cho các thao tác cơ sở dữ liệu an toàn và đáng tin cậy hơn.

Sử dụng None trong xử lý lỗi

None cũng được sử dụng như một phần của việc xử lý lỗi. Đặc biệt, trong các tình huống cần xử lý ngoại lệ hoặc kiểm tra lỗi, việc xác định một kết quả có phải là None giúp dễ dàng kiểm tra lỗi.

def divide(a, b):
    if b == 0:
        return None
    return a / b

result = divide(10, 0)
if result is None:
    print("Error: Division by zero occurred")
else:
    print(f"Result: {result}")

Trong ví dụ này, hàm divide kiểm tra việc chia cho zero và trả về None trong trường hợp lỗi. Điều này cho phép người gọi kiểm tra None và hiển thị thông báo lỗi phù hợp.

7. Các thực tiễn tốt nhất khi kiểm tra None

Khi kiểm tra None trong Python, việc sử dụng phương pháp thích hợp có thể cải thiện khả năng đọc và độ tin cậy của mã. Dưới đây là các thực tiễn tốt nhất để kiểm tra None.

Cách tiếp cận được khuyến nghị để kiểm tra None dựa trên PEP 8

PEP 8, hướng dẫn phong cách chính thức của Python, khuyến nghị sử dụng toán tử is để kiểm tra None. Điều này làm cho danh tính đối tượng mong muốn trở nên rõ ràng và phân biệt None với các giá trị “falsy” khác.

value = None
if value is None:
    print("value is None")

Sử dụng is để kiểm tra None cải thiện khả năng đọc và làm rõ ý định, giúp ngăn ngừa lỗi.

Các ví dụ mã để cải thiện khả năng đọc và bảo trì

Đối với khả năng đọc và bảo trì, việc kiểm tra None bằng mã đơn giản, dễ hiểu là rất quan trọng. Ngoài ra, khi None được mong đợi, việc thêm chú thích để làm rõ mục đích và ý định của None cũng rất hữu ích.

# When no value is set, None is expected
data = fetch_data()
if data is None:
    print("Could not retrieve data")

Bằng cách này, việc làm rõ ý nghĩa của None bằng các chú thích giúp việc bảo trì mã trong tương lai trở nên dễ dàng hơn.

侍エンジニア塾