Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python TypeError:'function' 객체는 첨자가 아닙니다. 해결 방법

반복 가능한 객체와 달리 인덱싱 구문을 사용하여 함수의 값에 액세스할 수 없습니다.

함수가 iterable을 반환하더라도 값에 액세스하기 전에 함수의 응답을 변수에 할당해야 합니다. 그렇지 않으면 "TypeError:'function' object is not subscriptable" 오류가 발생합니다.

이 가이드에서는 이 오류의 의미에 대해 설명합니다. 코드에서 이 오류를 해결하는 방법을 알아낼 수 있도록 이 오류의 두 가지 예를 살펴봅니다.

TypeError:'function' 개체는 첨자할 수 없습니다.

목록 및 문자열과 같은 반복 가능한 객체는 인덱싱 표기법을 사용하여 액세스할 수 있습니다. 이를 통해 iterable에서 개별 항목 또는 항목 범위에 액세스할 수 있습니다.

다음 코드를 고려하십시오.

grades = ["A", "A", "B"]
print(grades[0])

인덱스 위치 0의 값은 A입니다. 따라서 코드는 "A"를 반환합니다. 이 구문은 함수에서 작동하지 않습니다. 이는 함수가 반복 가능한 객체가 아니기 때문입니다. 함수는 호출된 경우에만 반복 가능한 객체를 반환할 수 있습니다.

"TypeError:'function' object is not subscriptable" 오류는 반복 가능한 개체인 것처럼 함수에 액세스하려고 할 때 발생합니다.

이 오류는 두 가지 시나리오에서 일반적입니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

  • 함수를 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" 사전에 있는 세 개의 값을 콘솔에 출력합니다. "pupil" 사전은 student() 함수에 인수로 전달됩니다.

함수를 호출하고 "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

이 오류는 같은 이름의 함수와 이터러블이 있기 때문에 발생합니다. "student"는 먼저 사전으로 선언됩니다. 그런 다음 같은 이름으로 함수를 정의합니다. 이것은 "학생"을 사전이 아닌 기능으로 만듭니다.

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

학생 목록에는 3개의 사전이 있습니다. 각 사전에는 학생의 이름과 가장 최근 시험에서 얻은 성적이 포함되어 있습니다.

다음으로 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

이 함수는 "pupils"라는 학생 목록을 허용합니다. 함수는 for 루프를 사용하여 해당 목록을 반복합니다. 특정 학생이 "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()를 호출합니다. 함수를 만들고 학생 목록을 매개변수로 지정합니다. 다음으로 인덱싱을 사용하여 get_a_grade_students() 목록에서 인덱스 위치 0에 있는 레코드를 검색합니다. 함수가 반환됩니다. 마지막으로 해당 레코드를 콘솔에 인쇄합니다.

코드를 실행해 보겠습니다.

[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}]
{'name': 'Samantha', 'grade': 'A'}

우리 코드는 먼저 "A" 등급을 받은 모든 학생의 목록을 출력합니다. 다음으로, 우리 코드는 목록에서 "A" 등급을 받은 첫 번째 학생을 출력합니다. 이 경우 그 학생은 Samantha였습니다.

결론

"TypeError:'function' object is not subscriptable" 오류는 함수가 문자열이나 목록과 같은 반복 가능한 개체인 것처럼 함수에서 항목에 액세스하려고 하면 발생합니다.

이 오류를 해결하려면 먼저 변수를 선언한 후 함수를 선언하여 값을 저장하는 변수를 재정의하지 않는지 확인하십시오. 그런 다음 반환하는 값에 액세스하기 전에 먼저 함수를 호출해야 합니다.

이제 전문 코더처럼 이 일반적인 Python 오류를 해결할 준비가 되었습니다!