Với Python, bạn chỉ lặp qua đối tượng nếu đối tượng có giá trị. Vì đối tượng lặp chỉ có mục tiếp theo truy cập được nếu giá trị không bằng None. Nếu cố lặp qua đối tượng None, gặp lỗi TypeError: 'NoneType' object is not iterable.
Trong hướng dẫn này, nói về ý nghĩa lỗi và tại sao gặp. Chúng ta đi qua ví dụ giúp bạn giải quyết lỗi Python phổ biến này.
TypeError: 'NoneType' object is not iterable
Để đối tượng lặp được, phải chứa giá trị. Giá trị None không lặp được vì không chứa đối tượng. None đại diện giá trị null.
Có khác biệt giữa đối tượng None và iterable rỗng. Lỗi không nêu nếu bạn có list rỗng hoặc chuỗi rỗng.
Vì list và chuỗi có kiểu dữ liệu lặp. Khi trình thông dịch Python gặp list rỗng, không lặp vì không giá trị. Python không lặp qua giá trị None nên trình thông dịch báo lỗi.
Lỗi thường gặp khi khai báo hàm quên trả về giá trị.
Tình huống ví dụ
Hãy viết chương trình lấy danh sách tên học sinh lọc ra những tên bắt đầu "E". In giá trị ra console.
Bắt đầu định nghĩa hàm lọc tên học sinh:
81% người tham gia cho biết họ cảm thấy tự tin hơn về cơ hội việc làm công nghệ sau khi tham gia bootcamp. Được ghép nối với bootcamp ngay hôm nay.
Sinh viên trung bình tốt nghiệp bootcamp mất chưa đến sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được việc đầu tiên.
def filter_students(class_names): new_class_names = [] for c in class_names: if c.startswith("E"): new_class_names.append(c) Hàm lặp qua mỗi mục "class_names" dùng for. Mỗi mục, vòng lặp kiểm tra mục bắt đầu "E". Nếu có, tên thêm vào "new_class_names".
Tiếp theo, viết hàm duyệt list mới in mỗi giá trị ra console:
def show_students(class_names): for c in class_names: print(c)
Ở đây, khai báo danh sách học sinh chương trình tìm. Truyền list qua filter_students:
students = ["Elena", "Peter", "Chad", "Sam"] students_e_name = filter_students(students)
Mã thực thi filter_students tìm học sinh tên "E". Danh sách tên "E" gọi students_e_name. Tiếp theo, gọi show_students hiển thị list mới:
show_students(students_e_name)
Hãy chạy mã xem:
Traceback (most recent call last): File "main.py", line 14, in <module> show_students(students_e_name) File "main.py", line 8, in show_students for c in class_names: TypeError: 'NoneType' object is not iterable
Mã trả thông báo lỗi.
Giải pháp
Khi thử lặp biến class_names trong show_students, mã phát hiện giá trị None và báo lỗi. Vì giá trị truyền "class_names" là None.
Lỗi do hàm filter_students không trả giá trị. Khi gán kết quả filter_students cho students_e_name, giá trị None được đặt.
Để khắc phục, phải trả giá trị trong filter_students:
def filter_students(class_names): new_class_names = [] for c in class_names: if c.startswith("E"): new_class_names.append(c) # We have added a return statement here return new_class_names def show_students(class_names): for c in class_names: print(c) students = ["Elena", "Peter", "Chad", "Sam"] students_e_name = filter_students(students) show_students(students_e_name) Mã trả về giá trị new_class_names về chương trình chính.
Hãy chạy mã xem hoạt động:
Elena
Mã giờ in thành công tên học sinh bắt đầu "E".
Tránh ngoại lệ NoneType
Kỹ thuật, tránh ngoại lệ NoneType bằng kiểm tra giá trị bằng None trước lặp. Xem mã:
def filter_students(class_names): new_class_names = [] for c in class_names: if c.startswith("E"): new_class_names.append(c) return new_class_names def show_students(class_names): if class_names is not None: for c in class_names: print(c) students = ["Elena", "Peter", "Chad", "Sam"] students_e_name = filter_students(students) show_students(students_e_name) Hàm "show_students()" thực thi thành công vì kiểm tra class_names không None trước lặp. Đây không phải thực hành tốt đa số trường hợp vì nguyên nhân NoneType có thể là vấn đề nơi khác mã.
Nếu thêm kiểm tra "is not None" vào chương trình đầy đủ, không biết quên return statement hàm khác. Đó là lý do nếu thấy lỗi này, tốt nhất chấp nhận ngoại lệ thay vì xử lý bằng kiểm tra "is not None".
Kết luận
Lỗi TypeError: 'NoneType' object is not iterable nêu lên khi cố lặp qua đối tượng giá trị bằng None.
Để khắc phục, đảm bảo mọi giá trị cố lặp đã gán đối tượng lặp, như chuỗi hoặc list. Ví dụ, quên thêm "return" cho hàm. Làm hàm trả None thay vì list.
Bây giờ bạn đã sẵn sàng giải quyết lỗi Python phổ biến này trong mã.