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

Python TypeError:วัตถุ 'ฟังก์ชัน' ไม่ใช่โซลูชันที่ห้อยลงมาได้

ไม่เหมือนกับวัตถุที่ทำซ้ำได้ คุณไม่สามารถเข้าถึงค่าจากฟังก์ชันโดยใช้ไวยากรณ์การจัดทำดัชนี

แม้ว่าฟังก์ชันจะคืนค่า 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 อย่างนักเขียนโค้ดมืออาชีพแล้ว!