python-253Đọc toàn bộ đề miễn phí

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

PythonCơ bản13 phút

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ủ đề

protocolsdunder-methodscontainersentry-ramp

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

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.

Nhóm Zalo