Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python TypeError:วัตถุ 'NoneType' ไม่สามารถทำซ้ำได้ Solution

ด้วย 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 ในโค้ดของคุณเองแล้ว