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 แล้ว!