Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lỗi Python TypeError: 'function' object is not subscriptable - Giải pháp

Khác với đối tượng lặp (iterable), bạn không truy cập giá trị từ hàm dùng cú pháp chỉ mục (indexing).

Dù hàm trả về iterable, bạn phải gán phản hồi từ hàm vào biến trước khi truy cập giá trị. Nếu không, gặp lỗi "TypeError: 'function' object is not subscriptable".

Trong hướng dẫn này, nói về ý nghĩa lỗi. Chúng ta đi qua hai ví dụ lỗi để bạn tìm cách khắc phục trong mã.

TypeError: 'function' object is not subscriptable

Đối tượng lặp như list và chuỗi truy cập dùng ký hiệu chỉ mục. Cho phép truy cập mục riêng lẻ, hoặc phạm vi mục, từ iterable.

Xem mã:

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

Giá trị vị trí chỉ mục 0 là A. Do đó, mã trả "A". Cú pháp này không hoạt động trên hàm. Vì hàm không phải đối tượng lặp. Hàm chỉ có thể trả về iterable nếu được gọi.

Lỗi "TypeError: 'function' object is not subscriptable" xảy ra khi bạn truy cập hàm như thể iterable.

Lỗi thường gặp hai tình huống:

81% người tham gia cho biết họ cảm thấy tự tin hơn về cơ hội việc làm công nghệ sau khi tham gia bootcamp. Được ghép nối với bootcamp ngay hôm nay.

Sinh viên trung bình tốt nghiệp bootcamp mất chưa đến sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được việc đầu tiên.

  • Khi gán hàm cùng tên iterable
  • Khi cố truy cập giá trị từ hàm như thể hàm lặp được

Hãy phân tích cả hai.

Tình huống #1: Hàm cùng tên Iterable

Tạo chương trình in thông tin học sinh trường. Bắt đầu định nghĩa dictionary thông tin học sinh và điểm test gần nhất:

student = { "name": "Holly", "latest_test_score": "B", "class": "Sixth Grade" }

Dictionary chứa ba khóa và ba giá trị. Khóa đại diện tên học sinh; khóa đại diện điểm test gần nhất; khóa đại diện lớp học sinh.

Tiếp theo, định nghĩa hàm in giá trị ra console:

def student(pupil): print("Name: " + pupil["name"]) print("Latest Test Score: " + pupil["latest_test_score"]) print("Class: " + pupil["class"])

Mã in ba giá trị "pupil" dictionary ra console. "pupil" dictionary truyền như đối số vào student().

Gọi hàm truyền "student" dictionary tham số:

student(student)

Mã Python báo lỗi:

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

Lỗi do hàm và iterable cùng tên. "student" khai báo dictionary trước. Sau đó định nghĩa hàm cùng tên. Làm "student" thành hàm không phải dictionary.

Khi truyền "student" tham số student(), truyền hàm tên "student".

Khắc phục bằng đổi tên hàm 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)

Đổi tên hàm "show_student_details". Hãy chạy mã xem:

Name: Holly Latest Test Score: B Class: Sixth Grade

Mã in thành công thông tin học sinh ra console.

Tình huống #2: Truy cập hàm dùng Indexing

Viết chương trình lọc hồ sơ học sinh chỉ hiện những học sinh đạt A test gần nhất.

Bắt đầu định nghĩa mảng học sinh:

students = [ { "name": "Holly", "grade": "B" }, { "name": "Samantha", "grade": "A" }, { "name": "Ian", "grade": "A" } ]

List học sinh chứa ba dictionary. Mỗi dictionary chứa tên và điểm test gần nhất.

Tiếp theo, định nghĩa hàm trả list học sinh đạt 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

Hàm chấp nhận list "pupils". Hàm lặp list dùng for. Nếu học sinh đạt "A", hồ sơ thêm "a_grade_students". Ngược lại, không xảy ra gì.

Sau tìm tất cả, mã in list học sinh đạt "A" và trả list về chương trình chính.

Chúng ta muốn lấy học sinh đầu tiên đạt "A". Làm bằng gọi hàm và dùng indexing lấy hồ sơ học sinh đầu:

first = get_a_grade_students[0] print(first)

Chạy mã:

Traceback (most recent call last): File "main.py", line 16, in <module> first = get_a_grade_students[0] TypeError: 'function' object is not subscriptable

Mã báo lỗi. Chúng ta truy cập giá trị từ "get_a_grade_students" không gọi hàm trước.

Khắc phục bằng gọi hàm trước khi truy cập giá trị trả về:

a_grades = get_a_grade_students(students) first = a_grades[0] print(first)

Đầu tiên, gọi get_a_grade_students() chỉ định list học sinh tham số. Tiếp theo, dùng indexing lấy hồ sơ vị trí 0 từ list hàm trả về. Cuối cùng, in hồ sơ ra console.

Thực thi mã:

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

Mã đầu in list tất cả học sinh đạt "A". Tiếp theo, in học sinh đầu tiên đạt "A". Học sinh đó Samantha.

Kết luận

Lỗi "TypeError: 'function' object is not subscriptable" nêu lên khi cố truy cập mục từ hàm như thể hàm iterable, như chuỗi hoặc list.

Khắc phục bằng trước đảm bảo không ghi đè biến lưu giá trị bằng khai báo hàm sau khai báo biến. Tiếp theo, đảm bảo gọi hàm trước khi truy cập giá trị trả về.

Bây giờ bạn đã sẵn sàng giải quyết lỗi Python phổ biến này như coder chuyên nghiệp!