Một phần câu hỏi liên quan đến các chỉ số nằm ngoài phạm vi
Logic lát cắt tự động cắt các chỉ số theo độ dài của chuỗi.
Việc cho phép các chỉ số lát cắt mở rộng các điểm cuối trước đây đã được thực hiện để thuận tiện. Sẽ rất khó khăn khi phải kiểm tra phạm vi mọi biểu thức và sau đó điều chỉnh các giới hạn theo cách thủ công, vì vậy Python sẽ làm điều đó cho bạn.
Hãy xem xét trường hợp sử dụng muốn hiển thị không quá 50 ký tự đầu tiên của tin nhắn văn bản.
Cách dễ dàng (những gì Python làm bây giờ):
preview = msg[:50]
Hoặc cách khó (tự kiểm tra giới hạn):
n = len(msg)
preview = msg[:50] if n > 50 else msg
Việc thực hiện thủ công logic đó để điều chỉnh các điểm cuối sẽ dễ bị quên, dễ bị sai (cập nhật 50 ở hai nơi), dài dòng và sẽ chậm. Python di chuyển logic đó vào bên trong của nó nơi nó thành công, tự động, nhanh chóng và chính xác. Đây là một trong những lý do tôi yêu thích Python :-)
Một phần câu hỏi liên quan đến độ dài bài tập không khớp với độ dài đầu vào
OP cũng muốn biết lý do để cho phép các phép gán, chẳng hạn như p[20:100] = [7,8]
mục tiêu gán có độ dài khác (80) với độ dài dữ liệu thay thế (2).
Dễ dàng nhất để xem động lực bằng cách tương tự với các chuỗi. Hãy xem xét "five little monkeys".replace("little", "humongous")
,. Lưu ý rằng mục tiêu "nhỏ" chỉ có sáu chữ cái và "humongous" có chín. Chúng ta có thể làm tương tự với các danh sách:
>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'
Tất cả điều này đều thuận tiện.
Trước khi ra đời các phương thức copy () và clear () , chúng thường là những thành ngữ phổ biến:
s[:] = []
t = u[:]
Ngay cả bây giờ, chúng tôi sử dụng điều này để cập nhật danh sách khi lọc:
s[:] = [x for x in s if not math.isnan(x)]
Hy vọng những ví dụ thực tế này cung cấp một cái nhìn tốt về lý do tại sao cắt hoạt động như nó.
if i > sequence.length(): return sequence.slice(0, sequence.length()) else sequence.slice(0, n)
Điều này giống hệt như chỉ sử dụngsequence[:n]
trong Python, nó giúp bạn tiết kiệm một câu lệnh if và 2 lệnh gọi tớilength
.