Computer >> Máy Tính >  >> Lập trình >> Python

Python TypeError:đối tượng kiểu ‘NoneType’ không có giải pháp len ()

len() phương thức chỉ hoạt động trên các đối tượng có thể lặp lại 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 lại chứa các chuỗi giá trị. Nếu bạn cố sử dụng len() phương thức trên giá trị Không, bạn sẽ gặp lỗi “TypeError:đối tượng kiểu‘ NoneType ’không có len() ”.

Trong hướng dẫn này, chúng tôi nói về lỗi này có nghĩa là gì và nó hoạt động như thế nào. Chúng tôi xem qua hai ví dụ về lỗi này trong thực tế để bạn có thể tìm ra cách giải quyết nó trong mã của mình.

TypeError:đối tượng kiểu 'NoneType' không có len ()

NoneType đề cập đến kiểu dữ liệu Không có. 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 lại, chẳng hạn như len() , trên giá trị Không có. Điều này là do Không có không chứa tập hợp các giá trị. Không thể tính độ dài của Không có vì Không có 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 chức năng tích hợp sẽ thay đổi danh sách tại chỗ
  • Nơi bạn quên câu lệnh trả về trong một hàm

Hãy cùng xem xét từng nguyên nhân một cách chuyên sâu.

Nguyên nhân # 1:Chức năng tích hợp Thay đổi danh sách tại chỗ

Chúng tôi sẽ xây dựng một chương trình sắp xếp 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 tôi sẽ sắp xếp danh sách này theo thứ tự tăng dần của điểm của học sinh trong bài kiểm tra cuối cùng của họ.

Để bắt đầu, hãy xác định danh sách các từ điển chứa thông tin về sinh viên và điểm kiểm tra gần đây 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 tương ứng với tên của một học sinh và một tương ứng với điểm mà một học sinh đạt được trong bài kiểm tra cuối cùng của họ. Tiếp theo, sử dụng sort() phương pháp sắp xếp danh sách sinh viên của chúng tôi:

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

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



sorted_students = students.sort(key=score_sort)

Chúng tôi đã khai báo một hàm được gọi là “score_sort” trả về giá trị của “score” trong mỗi từ điển. Sau đó, chúng tôi sử dụng điều này để sắp xếp các mục trong danh sách từ điển của chúng tôi bằng cách sử dụng sort() phương pháp.

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

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

Chúng tôi in danh sách từ điển mới ra bảng điều khiển 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 một thông báo cho chúng tôi biết số điểm mà một học sinh đạt được trong bài kiểm tra cuối cùng của họ cho mỗi học sinh trong danh sách “sorted_students”. Hãy chạy mã của chúng tôi:

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

Mã của chúng tôi trả về một lỗi.

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

Xóa phần khai báo của danh sách “sorted_students” và sử dụng “sinh viên” trong phần còn lại của chương trình của chúng tôi:

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ã của chúng tôi và xem điều gì sẽ xảy ra:

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ã của chúng tôi thực thi thành công. Đầu tiên, mã của chúng tôi cho chúng tôi biết có bao nhiêu sinh viên trong danh sách của chúng tôi. Sau đó, mã của chúng tôi in ra thông tin về từng học sinh và số điểm mà họ đạt được trong bài kiểm tra cuối cùng của mình. Thông tin này được in ra theo thứ tự tăng dần của điểm học sinh.

Nguyên nhân # 2:Quên Báo cáo Trả hàng

Chúng tôi sẽ làm cho mã của chúng tôi trở nên mô-đun hơn. Để làm điều này, chúng tôi chuyển phương pháp sắp xếp của chúng tôi thành chức năng riêng của nó. Chúng tôi cũng sẽ xác định một chức năng in ra thông tin về số điểm mà mỗi học sinh đạt được trong bài kiểm tra của họ.

Bắt đầu bằng cách xác định danh sách sinh viên và chức năng trợ giúp sắp xếp của chúng tôi. Chúng tôi sẽ mượn mã này từ phần trước trong 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 tôi xác định 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 của mình:

new_students = sort_list(students)
show_students(new_students)

Chương trình của chúng tôi trước tiên sẽ sắp xếp danh sách của chúng tôi bằng cách sử dụng sort_list() chức năng. Sau đó, chương trình của chúng tôi sẽ in thông tin về từng học sinh ra bảng điều khiển. Điều này được xử lý trong show_students() chức năng.

Hãy chạy mã của chúng tôi:

Traceback (most recent call last):
  File "main.py", line 21, in <module>
	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ã của chúng tôi trả về một lỗi. Lỗi này đã xảy ra vì chúng tôi đã quên đưa câu lệnh “return” vào hàm “sort_list” của mình.

Khi chúng tôi gọi sort_list() , chúng tôi gán phản hồi của nó cho biến “new_students”. Biến đó được chuyển vào show_students() của chúng tôi chức năng hiển thị thông tin về từng sinh viên. Để giải quyết lỗi này, chúng ta phải thêm câu lệnh trả về vào sort_list() chức năng:

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

Chạy mã của chúng tôi:

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ã của chúng tôi trả về phản hồi mà chúng tôi mong đợi.

Kết luận

Đối tượng “TypeError:kiểu‘ NoneType ’không có len() ”Xảy ra lỗi khi bạn cố sử dụng len() trên một đối tượng có giá trị là Không.

Để giải quyết lỗi này, hãy đảm bảo rằng bạn không chỉ định phản hồi của bất kỳ phương thức danh sách tích hợp nào, chẳng hạn như sort() , vào một biến. Nếu điều này không giải quyết được lỗi, hãy đảm bảo rằng chương trình của bạn có tất cả các câu lệnh “return” mà nó cần để 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!