Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Giải pháp lỗi Python TypeError: object of type 'NoneType' has no len()

Phương thức len() chỉ hoạt động trên các đối tượng có thể lặp (iterable) như chuỗi, danh sách và từ điển. Điều này là do các đối tượng có thể lặp chứa các chuỗi giá trị. Nếu bạn thử sử dụng phương thức len() trên một giá trị None, bạn sẽ gặp lỗi TypeError: object of type 'NoneType' has no len().

Trong hướng dẫn này, chúng ta nói về ý nghĩa của lỗi này và cách nó hoạt động. Chúng ta đi qua hai ví dụ của lỗi này trong thực tế để bạn có thể tìm ra cách khắc phục trong mã của mình.

TypeError: object of type 'NoneType' has no len()

NoneType tham chiếu đến kiểu dữ liệu None. Bạn không thể sử dụng các phương thức hoạt động trên các đối tượng có thể lặp, như len(), trên một giá trị None. Điều này là do None không chứa tập hợp các giá trị. Độ dài của None không thể tính toán vì None không có giá trị con.

Lỗi này thường gặp trong hai trường hợp:

  • Khi bạn quên rằng các hàm tích hợp sẵn thay đổi danh sách ngay tại chỗ (in-place)
  • Khi bạn quên câu lệnh return trong một hàm

Hãy xem xét kỹ từng nguyên nhân này.

Nguyên nhân #1: Hàm tích hợp sẵn thay đổi danh sách ngay tại chỗ

Chúng ta sẽ xây dựng một chương trình sắp xếp một danh sách các từ điển chứa thông tin về học sinh tại một trường học. Chúng ta sẽ sắp xếp danh sách này theo thứ tự tăng dần của điểm bài kiểm tra cuối cùng của học sinh.

Đầu tiên, định nghĩa một danh sách từ điển chứa thông tin về học sinh và điểm bài kiểm tra gần nhất của họ:

students = [
    {"name": "Peter", "score": 76},
    {"name": "Richard", "score": 63},
    {"name": "Erin", "score": 64},
    {"name": "Miley", "score": 89}
]

Mỗi từ điển chứa hai khóa và giá trị. Một khóa tương ứng với tên học sinh và khóa kia tương ứng với điểm học sinh đạt được trong bài kiểm tra cuối. Tiếp theo, sử dụng phương thức sort() để sắp xếp danh sách học sinh của chúng ta:

def score_sort(s):
    return s["score"]

sorted_students = students.sort(key=score_sort)

Chúng ta đã khai báo một hàm tên "score_sort" trả về giá trị "score" trong mỗi từ điển. Sau đó, chúng ta dùng hàm này để sắp xếp các mục trong danh sách từ điển của chúng ta bằng phương thức sort().

Tiếp theo, chúng ta in ra độ dài của danh sách:

print("There are {} students in the list.".format(len(sorted_students)))

Chúng ta in danh sách từ điển mới ra console bằng vòng lặp for:

for s in sorted_students:
    print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

Mã này in ra thông báo cho biết điểm số mỗi học sinh đạt được trong bài kiểm tra cuối cho mỗi học sinh trong danh sách "sorted_students". Chạy mã:

Traceback (most recent call last):
  File "main.py", line 13, in 
    print("There are {} students in the list.".format(len(sorted_students)))
TypeError: object of type 'NoneType' has no len()

Mã của chúng ta trả về lỗi.

Để giải quyết vấn đề này, chúng ta cần xóa mã gán kết quả của phương thức sort() cho "sorted_students". Điều này là do phương thức sort() thay đổi danh sách ngay tại chỗ. Nó không tạo ra một danh sách mới.

Xóa khai báo danh sách "sorted_students" và sử dụng "students" trong phần còn lại của chương trình:

students.sort(key=score_sort)
print("There are {} students in the list.".format(len(students)))
for s in students:
    print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

Chạy mã và xem kết quả:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

Mã thực thi thành công. Đầu tiên, mã cho chúng ta biết có bao nhiêu học sinh trong danh sách. Sau đó, mã in ra thông tin về mỗi học sinh và điểm họ đạt được. Thông tin này được in theo thứ tự tăng dần của điểm học sinh.

Nguyên nhân #2: Quên câu lệnh Return

Chúng ta sẽ làm cho mã của mình mô-đun hơn. Để làm điều này, chúng ta di chuyển phương thức sắp xếp vào một hàm riêng. Chúng ta cũng sẽ định nghĩa một hàm in ra thông tin về điểm mà mỗi học sinh đạt được.

Bắt đầu bằng cách định nghĩa danh sách học sinh và hàm hỗ trợ sắp xếp. Chúng ta sẽ mượn mã này từ phần trước của hướng dẫn.

students = [
    {"name": "Peter", "score": 76},
    {"name": "Richard", "score": 63},
    {"name": "Erin", "score": 64},
    {"name": "Miley", "score": 89}
]

def score_sort(s):
    return s["score"]

Tiếp theo, viết một hàm sắp xếp danh sách của chúng ta:

def sort_list(students):
    students.sort(key=score_sort)

Cuối cùng, chúng ta định nghĩa một hàm hiển thị thông tin về thành tích của từng học sinh:

def show_students(new_students):
    print("There are {} students in the list.".format(len(students)))
    for s in new_students:
        print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

Trước khi chạy mã, chúng ta phải gọi các hàm:

new_students = sort_list(students)
show_students(new_students)

Chương trình sẽ trước tiên sắp xếp danh sách bằng hàm sort_list(). Sau đó, chương trình sẽ in ra thông tin về mỗi học sinh ra console. Điều này được xử lý trong hàm show_students().

Chạy mã:

Traceback (most recent call last):
  File "main.py", line 21, in 
    show_students(new_students)
  File "main.py", line 15, in show_students
    print("There are {} students in the list.".format(len(new_students)))
TypeError: object of type 'NoneType' has no len()

Mã trả về lỗi. Lỗi này xảy ra vì chúng ta quên bao gồm câu lệnh "return" trong hàm "sort_list".

Khi chúng ta gọi hàm sort_list(), chúng ta gán phản hồi của nó cho biến "new_students". Biến đó được truyền vào hàm show_students() hiển thị thông tin về mỗi học sinh. Để khắc phục lỗi này, chúng ta phải thêm câu lệnh return vào hàm sort_list():

def sort_list(students):
    students.sort(key=score_sort)
    return students

Chạy mã:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

Mã trả về kết quả chúng ta mong đợi.

Kết luận

Lỗi TypeError: object of type 'NoneType' has no len() xảy ra khi bạn thử sử dụng phương thức len() trên một đối tượng có giá trị None.

Để khắc phục lỗi này, hãy đảm bảo bạn không gán phản hồi của bất kỳ phương thức danh sách tích hợp sẵn nào, như sort(), cho một biến. Nếu điều này không khắc phục được lỗi, hãy đảm bảo chương trình của bạn có tất cả các câu lệnh "return" cần thiết để hoạt động thành công.

Bây giờ bạn đã sẵn sàng giải quyết vấn đề này như một chuyên gia Python!