Danh sách phát cài `__len__`, `__getitem__`, `__contains__`
len(x), x[i], x[a:b] và y in x đều là cú pháp đẹp che bốn lời gọi phương thức
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: python-basics, python-classes-intro, python-list-basics.
Nội dung đề bài
Mô tả bài toán
len(x), x[i], x[a:b] và y in x đều là cú pháp đẹp che bốn lời gọi phương thức len, getitem, getitem với slice và contains. Tự viết một vật chứa nhỏ là cách nhanh nhất để thấy bốn lời gọi đó và biết rằng chỉ số âm do chính getitem của bạn xử lý.
Yêu cầu
Cài đặt lớp Playlist:
- init(self, songs): nhận một dãy tên bài hát và lưu thành danh sách riêng trong
self._songs (không giữ tham chiếu tới dãy gốc).
- len(self): trả về số bài hát, để len(playlist) chạy được.
- getitem(self, index): trả về bài hát ở vị trí index, chấp nhận chỉ số âm và
cả slice.
- contains(self, name): trả về True nếu tên bài hát có trong danh sách.
- add(self, name): thêm một bài hát vào cuối danh sách, trả về None.
- has(self, name): trả về name in self, tức dùng contains vừa viết.
- slice_of(self, start, stop): trả về danh sách bài hát trong khoảng [start, stop)
bằng list(self[start:stop]).
Quy ước nộp bài
Nộp lớp Playlist trong solution.py. Hệ thống tự khởi tạo lớp bằng Playlist(songs=[...]), gọi trực tiếp cả các phương thức len, getitem, contains lẫn các phương thức thường, và bắt ngoại lệ IndexError; không dùng stdin/stdout.
Input
Hệ thống khởi tạo lớp bằng tham số từ khoá songs (danh sách chuỗi), rồi gọi lần lượt các phương thức theo kịch bản của từng bộ test. Vì dữ liệu test ở dạng JSON, kịch bản gọi slice_of(start, stop) bằng hai số nguyên thay vì truyền trực tiếp slice.
Output
Danh sách giá trị trả về theo đúng thứ tự gọi. add trả None; len trả int.
Ràng buộc
- Chỉ số nằm ngoài danh sách phải để lỗi IndexError tự nhiên của danh sách bên trong.
- slice_of lấy đoạn nửa mở [start, stop), không bao gồm phần tử thứ stop.
- has và contains phải cùng một kết quả vì cùng một luật.
Ví dụ 1
Input
Playlist(init={"songs": ["Nang am", "Mua", "Bien"]}, methods=[{"method": "__len__"}, {"method": "__getitem__", "args": [-1]}])
Output
[3, "Bien"]
Ví dụ 2
Input
Playlist(init={"songs": ["A", "B", "C"]}, methods=[{"method": "has", "args": ["B"]}, {"method": "__getitem__", "args": [0]}])
Output
[true, "A"]
Giải thích
Với songs=["A", "B", "C"] thì len() là 3, has("B") là True, getitem(-1) là "C" và slice_of(0, 2) là ["A", "B"].
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
