Hướng dẫn dùng on slice python

Tiếp tục với chủ đề , bài viết sẽ giới thiệu cho các bạn về hàm slice() với cú pháp, cách sử dụng cũng như các ví dụ cụ thể. Mời bạn đọc theo dõi.

Hàm slice() trong trả về một slice object. Đối tượng này giúp bạn xác định cách cắt một chuỗi có sẵn (có thể là string, bytes, tuple, list, range) hoặc các đối tượng hỗ trợ giao thức chuỗi (như _getitem__(), __len__()).

Cú pháp hàm slice() trong Python:

slice(stop)   slice(start, stop, step)

Các tham số của hàm slice()

Hàm slice() có thể có tới 3 tham số:

Nếu chỉ truyền một tham số vào slice() thì start và step không có giá trị.

Giá trị trả về từ slice()

Hàm slice() trả về một slice object sử dụng để cắt một chuỗi theo các chỉ mục tương ứng truyền trong hàm.

Hầu hết các mẹo mà mình đưa ra tập trung vào cú pháp và cách sử dụng hiệu quả các module, hàm, class sẵn có của python.

Chú ý:

Để hiểu các bài viết trong loạt bài này, bạn nên có các kiến thức về lập trình với ngôn ngữ python, nếu bạn chưa rõ về python và muốn tìm hiểu nó, thì mình đề xuất các bạn đọc các khóa học lập trình cơ bản với python, trước khi đọc các bài viết trong loạt bài này. Khóa học về python cơ bản bạn có thể tìm thấy ở đây.

Mình nghĩ rằng với rất nhiều người thì Python là ngôn ngữ thứ 2 được người đó sử dụng. Giống như vậy, khi học trong trường đại học thì ngôn ngữ tôi được tiếp xúc đầu tiên là C sau đó đến C++ và Java.

Khi chuyển từ C/C++ hay bất kì ngôn ngữ nào khác sang Python thì không tránh khỏi được việc áp đặt tư duy lập trình của ngôn ngữ cũ mình Python, dẫn tới việc không thể tận dụng được tối đa sức mạnh của ngôn ngữ này.

Hãy đặt ra một tình huống. Bạn có một mảng các ký tự như sau:

A = [‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘V’, ‘i’, ‘m’, ‘e’, ‘n’, ‘t’, ‘o’, ‘r’]

Để có được một mảng con B của A chứa các ký tự B = [‘V’, ‘i’, ‘m’, ‘e’, ‘n’, ‘t’, ‘o’, ‘r’] thì với C/C++ bạn sẽ dùng phương pháp nào?

Mình đoán là có nhiều bạn sẽ nghĩ tới việc duyệt qua một lượt các phần tử của mảng rồi gán giá trị của A cho B. Đúng là bạn có thể làm như vậy để đạt được mục đích của mình (tuy nhiên cách này chưa hẳn là cách tối ưu), rồi bạn đem tư duy này sang Python, viết một hàm hoằm hố để trích xuất một phần của mảng cha theo chỉ số ‘start’ và ‘end’ để trả về một mảng mà bạn mong muốn.

Nếu bạn vẫn đang dùng, hay vẫn có lối tư duy như trên thì bạn hãy thử tham khảo một kỹ thuật mới sau đây - Đó là là list slicing.

Cú pháp sử dụng khá đơn giản như sau:

A[start:end]  # Trả về các phần tử từ vị trí start tới end-1

A[start:]     # Trả về tất cả các phần tử trong list a

A[:end]       # Trả về các phần tử từ vị trí bắt đầu của list (0) tới vị trí end-1

A[:]          # Trả về một bản sao của list a

Ngoài ra chúng ta cũng có thể sử dụng thêm một tham số step cho các trường hợp trên.

A[start:end:step]            # Lấy các phần tử bắt đầu từ vị trí start tới end (không

                             # lấy phần tử ở vị trí end) với bước nhảy là step

Một điều thú vị nữa là start và end có thể là một số dương hoặc âm. Khi chúng là số âm, thì chúng thực hiện đếm phần tử từ cuối của list thay vì từ đầu.

A[-1]    # Phần tử cuối cùng trong list

A[-2:]   # Hai phần tử cuối cùng trong list

A[:-2]   # Lấy tất cả các phần tử trừ 2 phần tử cuối

Tương tự như vậy: step cũng hoàn toàn có thể có giá trị âm

A[::-1]     # Đảo ngược vị trí của tất cả phần tử trong list

A[1::-1]    # Đảo ngược vị trí của hai phần tử đầu tiên

A[:-3:-1]   # Đảo ngược vị trí của 3 phần tử cuối cùng

A[-3::-1]   # Đảo ngược vị trí của tất cả các phần tử ngoại trừ hai phần tử cuối
 

Trên đây là các cách dùng cơ bản của python list slice. Nếu như ở các ngôn ngữ khác như C/C++ bạn phải rất vất vả để làm được những điều tương tự. thì với python bạn sẽ cảm thấy nhẹ nhàng hơn nhiều.

Còn nhiều điều thú vị nữa mà bạn có thể làm với list slice, mình sẽ chia sẻ luôn sau đây:

Nếu bạn có một list chỉ chứa một phần tử, ví dụ: A = [‘a’], và giả sử là bạn không biết điều đó, bạn lại muốn lấy ra  tất cả các phần tử trừ 2 phần tử cuối A[:-2].

Bạn nghĩ điều gì xảy ra khi ta làm như vậy? Đôi khi bạn mong chờ nó sẽ trả về một lỗi, nhưng trong thực tế thì nó lại trả về một list rỗng.

>>> A = ['a']

>>> A[:-2]

[]

Chúng ta cần biết được cách hành xử của python trong trường hợp này để có thể tránh lỗi và debug chương trình nhanh hơn.

Tiếp tục với một câu hỏi là "có bao giờ bạn sử dụng cú pháp của python list slice mà không điền một chỉ số nào cả?"

Hãy cùng xem một số  trường hợp sau:

>>> lst = [1, 2, 3, 4, 5]
>>> del lst[:]
>>> lst
[]

Chú ý là cú pháp ‘del lst[:]’ sẽ cho kết quả khác với ‘del lst’. Để biết được sự khác nhau này bạn hãy thử tự kiểm trứng nhé!

>>> a = lst
>>> lst[:] = [11, 12, 13]
>>> lst
[11, 12, 13]
>>> a
[11, 12, 13]
>>> a is lst
True
>>> b = lst[:]
>>> b
[11, 12, 13]
>>> b is lst
False
  Cách sử dụng này khá là fun đúng không? Hãy áp dụng nó ngay vào project của bạn!

Kết luận

Với những mẹo được đề cập trong bài, mình nghĩ là đã khá bao quát các trường hợp sử dụng trong thực tế. Chắc chắn với list slice bạn có thể giảm thiểu thời gian viết code xuống rất nhiều, bởi vì trong python, dữ liệu kiểu list là kiểu dữ liệu vô cùng phổ biến. Chính vì sự phổ biến và quan trọng của nó, bài sau mình sẽ dành thời gian để viết về các mẹo sử dụng python list comprehension. Nếu các bạn thấy bài viết hữu ích hoặc phát hiện ra bất kỳ ra lỗi nào trong bài hãy like và comment để cho mình biết và lấy động lực viết tiếp loạt bài này nhé. :D