ด้วย Python คุณสามารถวนซ้ำวัตถุได้ก็ต่อเมื่อวัตถุนั้นมีค่า เนื่องจากวัตถุที่ทำซ้ำได้จะมีเฉพาะรายการถัดไปซึ่งสามารถเข้าถึงได้หากค่าของวัตถุนั้นไม่เท่ากับไม่มี หากคุณพยายามวนซ้ำอ็อบเจ็กต์ None คุณพบ TypeError: ‘NoneType’ object is not iterable
ข้อผิดพลาด.
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุที่คุณอาจพบข้อผิดพลาดนี้ เราอธิบายตัวอย่างเพื่อช่วยคุณแก้ปัญหาข้อผิดพลาดทั่วไปของ Python
TypeError:วัตถุ 'NoneType' ไม่สามารถทำซ้ำได้
วัตถุนั้นจะต้องมีค่า ค่า None ไม่สามารถทำซ้ำได้เนื่องจากไม่มีอ็อบเจ็กต์ใดๆ ไม่มีแสดงถึงค่า Null
มีความแตกต่างระหว่างอ็อบเจกต์ None และว่างเปล่า iterable ข้อผิดพลาดนี้จะไม่เกิดขึ้นหากคุณมีรายการหรือสตริงว่าง
เนื่องจากรายการและสตริงมีประเภทข้อมูลที่ทำซ้ำได้ เมื่อล่าม Python พบรายการว่าง ล่ามจะไม่วนซ้ำเนื่องจากไม่มีค่า Python ไม่สามารถวนซ้ำค่า None ดังนั้นล่ามจึงส่งกลับข้อผิดพลาด
ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อคุณประกาศฟังก์ชันและลืมคืนค่า
ตัวอย่างสถานการณ์
มาเขียนโปรแกรมที่ใช้รายชื่อนักเรียนและกรองชื่อที่ขึ้นต้นด้วย "E" ออก เราจะพิมพ์ค่าเหล่านั้นไปที่คอนโซล
เริ่มต้นด้วยการกำหนดฟังก์ชันที่กรองชื่อนักเรียนออก:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
def filter_students(class_names): new_class_names = [] for c in class_names: if c.startswith("E"): new_class_names.append(c)
ฟังก์ชันนี้วนซ้ำทุกรายการในรายการ "class_names" โดยใช้ for loop สำหรับแต่ละรายการ ลูปของเราจะตรวจสอบว่ารายการที่ขึ้นต้นด้วยตัวอักษร "E" หรือไม่ หากเป็นเช่นนั้น ชื่อนั้นจะถูกเพิ่มในรายการ “new_class_names”
ต่อไป เขียนฟังก์ชันที่ผ่านรายการใหม่ของเราและพิมพ์แต่ละค่าไปยังคอนโซล:
def show_students(class_names): for c in class_names: print(c)
ในที่นี้ เราประกาศรายชื่อนักเรียนที่โปรแกรมของเราควรทำการค้นหา เราส่งรายชื่อนักเรียนนี้ผ่านฟังก์ชัน filter_students ของเรา:
students = ["Elena", "Peter", "Chad", "Sam"] students_e_name = filter_students(students)
รหัสนี้เรียกใช้ฟังก์ชัน filter_students ซึ่งค้นหานักเรียนทั้งหมดที่ชื่อขึ้นต้นด้วย "E" รายชื่อนักเรียนที่ชื่อขึ้นต้นด้วย "E" เรียกว่า students_e_name ต่อไป เราเรียกฟังก์ชัน show_students เพื่อแสดงรายการนักเรียนใหม่:
show_students(students_e_name)
เรียกใช้โค้ดของเราแล้วดูว่าเกิดอะไรขึ้น:
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
รหัสของเราส่งคืนข้อความแสดงข้อผิดพลาด
วิธีแก้ปัญหา
เมื่อเราพยายามวนซ้ำตัวแปร class_names ในฟังก์ชัน show_students โค้ดของเราจะตรวจพบค่า None และทำให้เกิดข้อผิดพลาด เนื่องจากค่าที่เราส่งเป็น “class_names” คือไม่มี
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากฟังก์ชัน filter_students ของเราไม่คืนค่า เมื่อเรากำหนดผลลัพธ์ของฟังก์ชัน filter_students ให้กับตัวแปร students_e_name ค่า None จะถูกตั้งค่า
เพื่อแก้ไขข้อผิดพลาดนี้ เราต้องคืนค่าในฟังก์ชัน 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)
รหัสนี้คืนค่าของ new_class_names กลับไปที่โปรแกรมหลัก
เรียกใช้โค้ดของเราเพื่อดูว่าใช้งานได้หรือไม่:
Elena
ตอนนี้รหัสของเราสามารถพิมพ์ชื่อนักเรียนที่ชื่อขึ้นต้นด้วย "E" ได้สำเร็จ
การหลีกเลี่ยงข้อยกเว้น NoneType
ในทางเทคนิค คุณสามารถหลีกเลี่ยงข้อยกเว้น NoneType โดยตรวจสอบว่าค่าเท่ากับ None ก่อนที่คุณจะวนซ้ำค่านั้น พิจารณารหัสต่อไปนี้:
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)
ฟังก์ชัน “show_students()” ทำงานได้สำเร็จเพราะเราตรวจสอบว่า class_names เป็นค่า None ก่อนที่เราจะลองทำซ้ำ นี่ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในกรณีส่วนใหญ่ เนื่องจากสาเหตุของข้อผิดพลาด NoneType อาจเป็นปัญหาที่อื่นในโค้ดของคุณ
หากเราเพิ่มการตรวจสอบ "ไม่ใช่ไม่มี" ลงในโปรแกรมทั้งหมดของเรา เราไม่รู้ว่าเราพลาดคำสั่งส่งคืนในฟังก์ชันอื่น นั่นเป็นสาเหตุหากคุณเห็นข้อผิดพลาดนี้ คุณควรยอมรับข้อยกเว้นแทนที่จะจัดการโดยใช้กาเครื่องหมาย “ไม่ใช่ไม่มี”
บทสรุป
TypeError: ‘NoneType’ object is not iterable
เกิดข้อผิดพลาดเมื่อคุณพยายามวนซ้ำบนวัตถุที่มีค่าเท่ากับไม่มี
ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าค่าใดๆ ที่คุณพยายามทำซ้ำได้รับการกำหนดค่าวัตถุที่ทำซ้ำได้ เช่น สตริงหรือรายการ ในตัวอย่างของเรา เราลืมเพิ่มคำสั่ง "return" ให้กับฟังก์ชัน สิ่งนี้ทำให้ฟังก์ชันส่งคืน None แทนที่จะเป็นรายการ
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปของ Python ในโค้ดของคุณเองแล้ว