ไม่เหมือนกับวัตถุที่ทำซ้ำได้ คุณไม่สามารถเข้าถึงค่าจากฟังก์ชันโดยใช้ไวยากรณ์การจัดทำดัชนี
แม้ว่าฟังก์ชันจะคืนค่า iterable คุณต้องกำหนดการตอบสนองจากฟังก์ชันให้กับตัวแปรก่อนที่จะเข้าถึงค่าของฟังก์ชันนั้น มิฉะนั้น คุณพบข้อผิดพลาด "TypeError:'function' object is not subscriptable"
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้ เราอธิบายสองตัวอย่างของข้อผิดพลาดนี้เพื่อให้คุณทราบวิธีแก้ปัญหาในโค้ดของคุณ
TypeError:วัตถุ 'ฟังก์ชัน' ไม่สามารถระบุได้
ออบเจ็กต์ที่ทำซ้ำได้ เช่น รายการและสตริง สามารถเข้าถึงได้โดยใช้สัญกรณ์การจัดทำดัชนี ซึ่งช่วยให้คุณเข้าถึงแต่ละรายการหรือช่วงของรายการจากการทำซ้ำได้
พิจารณารหัสต่อไปนี้:
grades = ["A", "A", "B"] print(grades[0])
ค่าที่ตำแหน่งดัชนี 0 คือ A ดังนั้นโค้ดของเราจะส่งกลับ "A" ไวยากรณ์นี้ใช้ไม่ได้กับฟังก์ชัน เนื่องจากฟังก์ชันไม่ใช่อ็อบเจ็กต์ที่ทำซ้ำได้ ฟังก์ชันสามารถส่งคืนอ็อบเจ็กต์ iterable ได้ก็ต่อเมื่อถูกเรียก
ข้อผิดพลาด "TypeError:'ฟังก์ชัน' ไม่สามารถระบุได้" เกิดขึ้นเมื่อคุณพยายามเข้าถึงฟังก์ชันราวกับว่าเป็นวัตถุที่ทำซ้ำได้
ข้อผิดพลาดนี้พบได้บ่อยในสองสถานการณ์:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
- เมื่อคุณกำหนดฟังก์ชัน ชื่อเดียวกับ iterable
- เมื่อคุณพยายามเข้าถึงค่าจากฟังก์ชันราวกับว่าฟังก์ชันนั้นสามารถทำซ้ำได้
มาวิเคราะห์สถานการณ์ทั้งสองนี้กัน
สถานการณ์ #1:ฟังก์ชันที่มีชื่อเดียวกับ Iterable
สร้างโปรแกรมที่พิมพ์ข้อมูลเกี่ยวกับนักเรียนที่โรงเรียน เราเริ่มต้นด้วยการกำหนดพจนานุกรมที่มีข้อมูลเกี่ยวกับนักเรียนและคะแนนการทดสอบล่าสุด:
student = { "name": "Holly", "latest_test_score": "B", "class": "Sixth Grade" }
พจนานุกรมของเราประกอบด้วยสามปุ่มและสามค่า หนึ่งคีย์แสดงถึงชื่อของนักเรียน หนึ่งคีย์แสดงถึงคะแนนที่นักเรียนได้รับจากการทดสอบครั้งล่าสุด หนึ่งคีย์แสดงถึงชั้นเรียนที่นักเรียนอยู่
ต่อไป เราจะกำหนดฟังก์ชันที่พิมพ์ค่าเหล่านี้ไปยังคอนโซล:
def student(pupil): print("Name: " + pupil["name"]) print("Latest Test Score: " + pupil["latest_test_score"]) print("Class: " + pupil["class"])
รหัสของเราพิมพ์ค่าสามค่าในพจนานุกรม "นักเรียน" ไปที่คอนโซล พจนานุกรม "pupil" ถูกส่งผ่านเป็นอาร์กิวเมนต์ในฟังก์ชัน student()
เรียกใช้ฟังก์ชันของเราและส่งพจนานุกรม "นักเรียน" เป็นพารามิเตอร์:
student(student)
โค้ด Python ของเราแสดงข้อผิดพลาด:
Traceback (most recent call last): File "main.py", line 8, in <module> student(student) File "main.py", line 4, in student print("Name: " + pupil["name"]) TypeError: 'function' object is not subscriptable
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากเรามีฟังก์ชันและ iterable ที่มีชื่อเดียวกัน “นักเรียน” ถูกประกาศเป็นพจนานุกรมครั้งแรก จากนั้นเรากำหนดฟังก์ชันที่มีชื่อเดียวกัน สิ่งนี้ทำให้ "นักเรียน" เป็นฟังก์ชันมากกว่าพจนานุกรม
เมื่อเราส่งผ่าน “student” เป็นพารามิเตอร์ไปยังฟังก์ชัน student() เรากำลังส่งฟังก์ชันที่มีชื่อว่า “student”
เราแก้ปัญหานี้ด้วยการเปลี่ยนชื่อฟังก์ชันนักเรียนของเรา:
def show_student_details(pupil): print("Name: " + pupil["name"]) print("Latest Test Score: " + pupil["latest_test_score"]) print("Class: " + pupil["class"]) show_student_details(student)
เราได้เปลี่ยนชื่อฟังก์ชันของเราเป็น “show_student_details” เรียกใช้โค้ดของเราแล้วดูว่าเกิดอะไรขึ้น:
Name: Holly Latest Test Score: B Class: Sixth Grade
รหัสของเราพิมพ์ข้อมูลเกี่ยวกับนักเรียนของเราไปยังคอนโซลได้สำเร็จ
สถานการณ์ #2:การเข้าถึงฟังก์ชันโดยใช้การจัดทำดัชนี
เขียนโปรแกรมที่กรองรายการบันทึกของนักเรียนและแสดงเฉพาะรายการที่นักเรียนได้เกรด A ในการทดสอบครั้งล่าสุด
เราจะเริ่มต้นด้วยการกำหนดอาร์เรย์ของนักเรียน:
students = [ { "name": "Holly", "grade": "B" }, { "name": "Samantha", "grade": "A" }, { "name": "Ian", "grade": "A" } ]
รายชื่อนักเรียนของเราประกอบด้วยพจนานุกรมสามเล่ม พจนานุกรมแต่ละฉบับประกอบด้วยชื่อนักเรียนและเกรดที่ได้รับจากการทดสอบครั้งล่าสุด
ถัดไป กำหนดฟังก์ชันที่ส่งคืนรายชื่อนักเรียนที่ได้เกรด A:
def get_a_grade_students(pupils): a_grade_students = [] for p in pupils: if p["grade"] == "A": a_grade_students.append(p) print(a_grade_students) return a_grade_students
ฟังก์ชันรับรายชื่อนักเรียนที่เรียกว่า “นักเรียน” ฟังก์ชันของเราวนซ้ำรายการนั้นโดยใช้ for loop หากนักเรียนคนใดคนหนึ่งได้เกรด "A" ระบบจะเพิ่มบันทึกลงในรายการ "a_grade_students" มิฉะนั้นจะไม่มีอะไรเกิดขึ้น
เมื่อค้นหานักเรียนทุกคนแล้ว รหัสของเราจะพิมพ์รายชื่อนักเรียนที่ได้เกรด "A" และส่งคืนรายชื่อนั้นไปยังโปรแกรมหลัก
เราต้องการเรียกนักเรียนคนแรกที่ได้เกรด A ในการดำเนินการนี้ เราเรียกฟังก์ชันของเราและใช้ไวยากรณ์การจัดทำดัชนีเพื่อดึงข้อมูลบันทึกของนักเรียนคนแรก:
first = get_a_grade_students[0] print(first)
เรียกใช้รหัสของเรา:
Traceback (most recent call last): File "main.py", line 16, in <module> first = get_a_grade_students[0] TypeError: 'function' object is not subscriptable
รหัสของเราส่งคืนข้อผิดพลาด เรากำลังพยายามเข้าถึงค่าจากฟังก์ชัน "get_a_grade_students" โดยไม่ต้องเรียกใช้ฟังก์ชันก่อน
ในการแก้ปัญหานี้ เราควรเรียกใช้ฟังก์ชันของเราก่อนที่เราจะดึงค่าจากมัน:
a_grades = get_a_grade_students(students) first = a_grades[0] print(first)
ขั้นแรก เราเรียก get_a_grade_students()
ฟังก์ชันและระบุรายชื่อนักเรียนของเราเป็นพารามิเตอร์ ต่อไป เราใช้การจัดทำดัชนีเพื่อดึงบันทึกที่ตำแหน่งดัชนี 0 จากรายการที่ get_a_grade_students()
ฟังก์ชันส่งคืน สุดท้าย เราพิมพ์บันทึกนั้นไปยังคอนโซล
มารันโค้ดของเรากัน:
[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}] {'name': 'Samantha', 'grade': 'A'}
รหัสของเราพิมพ์รายชื่อนักเรียนทั้งหมดที่ได้รับเกรด "A" ก่อน ต่อไป รหัสของเราจะพิมพ์นักเรียนคนแรกในรายการที่ได้เกรด "A" นักเรียนคนนั้นคือซาแมนธาในกรณีนี้
บทสรุป
ข้อผิดพลาด "TypeError:'ฟังก์ชัน' ไม่สามารถระบุได้" ปรากฏขึ้นเมื่อคุณพยายามเข้าถึงรายการจากฟังก์ชันราวกับว่าฟังก์ชันนั้นเป็นออบเจกต์ที่ทำซ้ำได้ เช่น สตริงหรือรายการ
ในการแก้ไขข้อผิดพลาดนี้ ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณไม่ได้แทนที่ตัวแปรใดๆ ที่เก็บค่าโดยการประกาศฟังก์ชันหลังจากที่คุณประกาศตัวแปร ขั้นต่อไป ตรวจสอบให้แน่ใจว่าคุณเรียกใช้ฟังก์ชันก่อนที่จะพยายามเข้าถึงค่าที่ฟังก์ชันส่งคืน
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปของ Python อย่างนักเขียนโค้ดมืออาชีพแล้ว!