Không giống như các đối tượng có thể lặp lại, bạn không thể truy cập một giá trị từ một hàm bằng cú pháp lập chỉ mục.
Ngay cả khi một hàm trả về một giá trị có thể lặp lại, bạn phải gán phản hồi từ một hàm cho một biến trước khi truy cập các giá trị của nó. Nếu không, bạn gặp phải lỗi "TypeError:" function "object is not subscriptable".
Trong hướng dẫn này, chúng tôi nói về lỗi này có nghĩa là gì. Chúng tôi xem qua hai ví dụ về lỗi này để bạn có thể tìm ra cách giải quyết nó trong mã của mình.
TypeError:đối tượng ‘function’ không thể chỉ định được
Các đối tượng có thể lặp lại như danh sách và chuỗi có thể được truy cập bằng cách sử dụng ký hiệu lập chỉ mục. Điều này cho phép bạn truy cập một mục riêng lẻ hoặc nhiều mục, từ một mục có thể lặp lại.
Hãy xem xét đoạn mã sau:
grades = ["A", "A", "B"] print(grades[0])
Giá trị ở vị trí chỉ mục 0 là A. Do đó, mã của chúng ta trả về “A”. Cú pháp này không hoạt động trên một hàm. Điều này là do một hàm không phải là một đối tượng có thể lặp lại. Các hàm chỉ có khả năng trả về một đối tượng có thể lặp lại nếu chúng được gọi.
Lỗi “TypeError:‘ function ’object is not subscriptable” xảy ra khi bạn cố gắng truy cập vào một hàm như thể nó là một đối tượng có thể lặp lại.
Lỗi này thường gặp trong hai trường hợp:
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
- Khi bạn chỉ định một hàm có cùng tên với một hàm có thể lặp lại
- Khi bạn cố gắng truy cập các giá trị từ một hàm như thể hàm đó có thể lặp lại được
Hãy phân tích cả hai tình huống này.
Tình huống # 1:Hàm có cùng tên với tính năng có thể lặp lại
Tạo một chương trình in ra thông tin về một học sinh tại một trường học. Chúng tôi bắt đầu bằng cách xác định một từ điển với thông tin về một sinh viên và điểm kiểm tra mới nhất của họ:
student = { "name": "Holly", "latest_test_score": "B", "class": "Sixth Grade" }
Từ điển của chúng tôi chứa ba khóa và ba giá trị. Một khóa đại diện cho tên của một học sinh; một khóa đại diện cho điểm mà một học sinh đạt được trong bài kiểm tra mới nhất của họ; một khóa đại diện cho lớp học mà học sinh đang theo học.
Tiếp theo, chúng ta sẽ xác định một hàm in ra các giá trị này vào bảng điều khiển:
def student(pupil): print("Name: " + pupil["name"]) print("Latest Test Score: " + pupil["latest_test_score"]) print("Class: " + pupil["class"])
Mã của chúng tôi in ra ba giá trị trong từ điển "học sinh" vào bảng điều khiển. Từ điển "student" được chuyển như một đối số vào hàm student ().
Hãy gọi hàm của chúng ta và chuyển từ điển “sinh viên” làm tham số:
student(student)
Mã Python của chúng tôi gặp 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 này là do chúng ta có một hàm và một hàm có thể lặp lại có cùng tên. "Sinh viên" đầu tiên được khai báo dưới dạng từ điển. Sau đó, chúng tôi xác định một hàm có cùng tên. Điều này làm cho "học sinh" trở thành một chức năng hơn là một từ điển.
Khi chúng ta truyền “student” dưới dạng tham số vào hàm student (), chúng ta đang truyền hàm với tên “student”.
Chúng tôi giải quyết vấn đề này bằng cách đổi tên hàm sinh viên của chúng tôi:
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)
Chúng tôi đã đổi tên hàm của mình thành “show_student_details”. Hãy chạy mã của chúng tôi và xem điều gì sẽ xảy ra:
Name: Holly Latest Test Score: B Class: Sixth Grade
Mã của chúng tôi in thành công thông tin về học sinh của chúng tôi lên bảng điều khiển.
Tình huống # 2:Truy cập một chức năng bằng cách sử dụng lập chỉ mục
Viết chương trình lọc danh sách hồ sơ học sinh và chỉ hiển thị những hồ sơ học sinh đạt điểm A trong bài kiểm tra mới nhất của họ.
Chúng ta sẽ bắt đầu bằng cách xác định một loạt các sinh viên:
students = [ { "name": "Holly", "grade": "B" }, { "name": "Samantha", "grade": "A" }, { "name": "Ian", "grade": "A" } ]
Danh sách sinh viên của chúng tôi có ba từ điển. Mỗi từ điển chứa tên của một học sinh và điểm mà họ đạt được trong bài kiểm tra gần đây nhất của họ.
Tiếp theo, xác định một hàm trả về danh sách các sinh viên đạt điểm 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 một danh sách các học sinh được gọi là “học sinh”. Hàm của chúng ta lặp lại danh sách đó bằng vòng lặp for. Nếu một học sinh cụ thể đạt điểm “A”, hồ sơ của họ sẽ được thêm vào danh sách “a_grade_students”. Nếu không, không có gì xảy ra.
Khi tất cả học sinh đã được tìm kiếm, mã của chúng tôi sẽ in ra danh sách các học sinh đạt điểm “A” và trả danh sách đó về chương trình chính.
Chúng tôi muốn truy xuất học sinh đầu tiên đạt điểm “A”. Để thực hiện việc này, chúng tôi gọi hàm của mình và sử dụng cú pháp lập chỉ mục để truy xuất hồ sơ của sinh viên đầu tiên:
first = get_a_grade_students[0] print(first)
Chạy mã của chúng tôi:
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ã của chúng tôi trả về một lỗi. Chúng tôi đang cố gắng truy cập một giá trị từ hàm “get_a_grade_students” mà không cần gọi hàm trước.
Để giải quyết vấn đề này, chúng ta nên gọi hàm của mình trước khi cố gắng truy xuất các giá trị từ nó:
a_grades = get_a_grade_students(students) first = a_grades[0] print(first)
Đầu tiên, chúng tôi gọi get_a_grade_students()
của chúng tôi hàm và chỉ định danh sách sinh viên của chúng ta dưới dạng một tham số. Tiếp theo, chúng tôi sử dụng lập chỉ mục để truy xuất bản ghi ở vị trí chỉ mục 0 từ danh sách get_a_grade_students()
hàm trả về. Cuối cùng, chúng tôi in bản ghi đó vào bảng điều khiển.
Hãy thực thi mã của chúng tôi:
[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}] {'name': 'Samantha', 'grade': 'A'}
Đầu tiên, mã của chúng tôi in ra danh sách tất cả học sinh đạt điểm “A”. Tiếp theo, mã của chúng tôi in ra học sinh đầu tiên trong danh sách đạt điểm “A”. Học sinh đó là Samantha trong trường hợp này.
Kết luận
Lỗi “TypeError:‘ function ’object is not subscriptable” được phát sinh khi bạn cố gắng truy cập một mục từ một hàm như thể hàm là một đối tượng có thể lặp lại, chẳng hạn như một chuỗi hoặc một danh sách.
Để giải quyết lỗi này, trước tiên hãy đảm bảo rằng bạn không ghi đè bất kỳ biến nào lưu trữ giá trị bằng cách khai báo một hàm sau khi bạn khai báo biến. Tiếp theo, hãy đảm bảo rằng bạn gọi một hàm trước khi cố gắng truy cập các giá trị mà nó trả về.
Bây giờ bạn đã sẵn sàng để giải quyết lỗi Python phổ biến này như một lập trình viên chuyên nghiệp!