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

Python TypeError:วัตถุประเภท 'NoneType' ไม่มี len() Solution

len() เมธอดใช้ได้เฉพาะกับอ็อบเจ็กต์ที่ทำซ้ำได้ เช่น สตริง รายการ และพจนานุกรม นี่เป็นเพราะวัตถุที่ทำซ้ำได้มีลำดับของค่า หากคุณลองใช้ len() วิธีค่า None คุณจะพบข้อผิดพลาด “TypeError:วัตถุประเภท 'NoneType' ไม่มี len()

ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และวิธีการทำงาน เราอธิบายสองตัวอย่างของข้อผิดพลาดนี้ในการใช้งานจริง เพื่อให้คุณทราบวิธีแก้ปัญหาในโค้ดของคุณ

TypeError:วัตถุประเภท 'NoneType' ไม่มี len()

NoneType หมายถึงชนิดข้อมูลไม่มี คุณไม่สามารถใช้วิธีการที่จะทำงานกับวัตถุที่ทำซ้ำได้ เช่น len() บนค่าไม่มี เนื่องจากไม่มีไม่มีคอลเลกชันของค่า ไม่สามารถคำนวณความยาวของไม่มีได้เนื่องจากไม่มีไม่มีค่าลูก

ข้อผิดพลาดนี้พบได้บ่อยในสองกรณี:

  • ในกรณีที่คุณลืมไปว่าฟังก์ชันในตัวจะเปลี่ยนรายการแบบแทนที่
  • ในกรณีที่คุณลืมคำสั่ง return ในฟังก์ชัน

มาดูสาเหตุแต่ละอย่างในเชิงลึกกัน

สาเหตุ #1:ฟังก์ชันในตัวเปลี่ยนรายการในตำแหน่ง

เรากำลังจะสร้างโปรแกรมที่จัดเรียงรายการพจนานุกรมที่มีข้อมูลเกี่ยวกับนักเรียนที่โรงเรียน เราจะจัดเรียงรายการนี้โดยเรียงจากน้อยไปมากของเกรดของนักเรียนในการทดสอบครั้งล่าสุด

ในการเริ่มต้น ให้กำหนดรายการพจนานุกรมที่มีข้อมูลเกี่ยวกับนักเรียนและคะแนนสอบล่าสุด:

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

พจนานุกรมแต่ละชุดประกอบด้วยคีย์และค่าสองคีย์ หนึ่งสอดคล้องกับชื่อของนักเรียนและอีกคนหนึ่งสอดคล้องกับคะแนนที่นักเรียนได้รับในการทดสอบครั้งล่าสุดของพวกเขา ต่อไป ใช้ sort() วิธีการจัดเรียงรายชื่อนักเรียนของเรา:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

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



sorted_students = students.sort(key=score_sort)

เราได้ประกาศฟังก์ชันที่เรียกว่า “score_sort” ซึ่งจะคืนค่าของ “score” ในแต่ละพจนานุกรม จากนั้นเราใช้คำสั่งนี้เพื่อเรียงลำดับรายการในพจนานุกรมของเราโดยใช้ sort() กระบวนการ.

ต่อไป เราพิมพ์ความยาวของรายการของเรา:

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

เราพิมพ์รายการพจนานุกรมใหม่ไปยังคอนโซลโดยใช้ for loop:

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

รหัสนี้พิมพ์ข้อความแจ้งจำนวนคะแนนที่นักเรียนได้รับจากการทดสอบครั้งสุดท้ายสำหรับนักเรียนแต่ละคนในรายการ "sorted_students" เรียกใช้รหัสของเรา:

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()

รหัสของเราส่งคืนข้อผิดพลาด

ในการแก้ปัญหานี้ เราจำเป็นต้องลบโค้ดที่เรากำหนดผลลัพธ์ของ sort() วิธีการ "sorted_students" ทั้งนี้เป็นเพราะ sort() วิธีการเปลี่ยนรายการในสถานที่ มันไม่ได้สร้างรายการใหม่

ลบการประกาศรายชื่อ "sorted_students" และใช้ "students" ในส่วนที่เหลือของโปรแกรม:

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"]))

เรียกใช้โค้ดของเราและดูว่าเกิดอะไรขึ้น:

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.

รหัสของเราดำเนินการได้สำเร็จ อันดับแรก รหัสของเราบอกเราว่ามีนักเรียนกี่คนในรายการของเรา รหัสของเราจะพิมพ์ข้อมูลเกี่ยวกับนักเรียนแต่ละคนและจำนวนคะแนนที่พวกเขาได้รับจากการทดสอบครั้งล่าสุด ข้อมูลนี้จัดพิมพ์โดยเรียงจากน้อยไปมากของเกรดของนักเรียน

สาเหตุ #2:ลืมคำชี้แจงการส่งคืน

เรากำลังจะทำให้โค้ดของเราเป็นแบบโมดูลาร์มากขึ้น ในการทำเช่นนี้ เราจะย้ายวิธีการจัดเรียงของเราไปเป็นฟังก์ชันของตัวเอง นอกจากนี้เรายังจะกำหนดฟังก์ชันที่พิมพ์ข้อมูลเกี่ยวกับคะแนนที่นักเรียนแต่ละคนได้รับจากการทดสอบ

เริ่มต้นด้วยการกำหนดรายชื่อนักเรียนและฟังก์ชันตัวช่วยการคัดแยกของเรา เราจะขอยืมโค้ดนี้จากตอนต้นในบทช่วยสอน

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

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

ต่อไป ให้เขียนฟังก์ชันที่เรียงลำดับรายการของเรา:

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

สุดท้าย เรากำหนดฟังก์ชันที่แสดงข้อมูลเกี่ยวกับประสิทธิภาพของนักเรียนแต่ละคน:

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"]))

ก่อนที่เราจะรันโค้ดของเรา เราต้องเรียกใช้ฟังก์ชันของเรา:

new_students = sort_list(students)
show_students(new_students)

โปรแกรมของเราจะเรียงลำดับรายการของเราก่อนโดยใช้ sort_list() การทำงาน. จากนั้นโปรแกรมของเราจะพิมพ์ข้อมูลเกี่ยวกับนักเรียนแต่ละคนไปที่คอนโซล สิ่งนี้ได้รับการจัดการใน show_students() ฟังก์ชัน

เรียกใช้รหัสของเรา:

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()

รหัสของเราส่งคืนข้อผิดพลาด ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากเราลืมใส่คำสั่ง "return" ในฟังก์ชัน "sort_list"

เมื่อเราเรียก sort_list() ฟังก์ชัน เรากำหนดการตอบสนองให้กับตัวแปร "new_students" ตัวแปรนั้นถูกส่งไปยัง show_students() . ของเรา ฟังก์ชั่นที่แสดงข้อมูลเกี่ยวกับนักเรียนแต่ละคน เพื่อแก้ไขข้อผิดพลาดนี้ เราต้องเพิ่มคำสั่ง return ใน sort_list() การทำงาน:

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

เรียกใช้รหัสของเรา:

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.

รหัสของเราส่งคืนการตอบกลับที่เราคาดไว้

บทสรุป

“TypeError:วัตถุประเภท 'NoneType' ไม่มี len() ” เกิดข้อผิดพลาดเมื่อคุณพยายามใช้ len() วิธีการบนวัตถุที่มีค่าเป็นไม่มี

ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณไม่ได้กำหนดคำตอบของวิธีการสร้างรายการในตัว เช่น sort() , เป็นตัวแปร หากวิธีนี้ไม่สามารถแก้ไขข้อผิดพลาดได้ ตรวจสอบให้แน่ใจว่าโปรแกรมของคุณมีคำสั่ง "ส่งคืน" ทั้งหมดที่จำเป็นสำหรับการทำงานได้สำเร็จ

ตอนนี้คุณพร้อมที่จะแก้ปัญหานี้อย่างมืออาชีพของ Python แล้ว!