Trang

Monday, June 1, 2015

Bài 14: String và xử lý String trong Python

Trong các bài học trước, chúng ta đã sử dụng rất nhiều đến String đúng không? Nhưng những thao tác đó vẫn chỉ ở mức cơ bản, hôm nay chúng ta sẽ cùng nhau đi xem xét kỹ hơn cách xử lý String nhé.

1. Một số thao tác xử lý cơ bản với String
Như các bạn biết, khi khai báo một string, chúng ta sử dụng cú pháp:
Code:
chuoi = 'your string'
Nhưng các bạn có biết được đó 1 chuỗi (String) cũng có thể được coi là 1 danh sách (list) có thứ tự được hợp thành từ các kí tự riêng rẽ. Như vậy, để xử lý từng ký tự của một String ta có thể dùng phương thức truy cập phần tử của danh sách để truy cập. Như các bạn biết chỉ mục (index) của danh sách chính là độ dời của phần tử trong danh sách đó. Chúng ta xem xét ví dụ bên dưới: 
Code:
>>> chuoi = 'your string'
>>> chuoi[1]
'o'
>>> chuoi[0]
'y'
Do chỉ mục chính là độ dời của kí tự trong chuỗi nên để xử lý kí tự đầu tiên, chúng ta sử dụng chỉ mục bắt đầu là 0, chứ không phải là 1. Và ngoài ra, chỉ mục phải là số nguyên nhé. Cụ thể hơn, để duyệt từng kí tự cho string, ta sử dụng 2 cách sau:
Cách 1: dùng chỉ mục của chuỗi
Code:
index = 0
while index < len(chuoi):
    letter = chuoi[index]
    print letter
    index = index + 1
Ở đây các bạn thấy 1 hàm khá mới được mình sử dụng: len(chuoi). Hàm này trả lại độ dài của chuỗi nhé các bạn.
Cách 2: dùng "in"
Code:
for char in chuoi:
    print char
Phần tiếp theo, mình sẽ trình bày một số cách xử lý String bằng việc sử dụng lát cắt của kiểu dữ liệu danh sách (list). 
Code:
>>> s = 'Monty Python'
>>> print s[0:5]
Cặp số trong dấu [0 : 5] cho phép trả lại chuỗi con của chuỗi ban đầu tính từ vị trí 0 đến 5. Tổng quát hơn ta có [m : n] sẽ cho chuỗi con từ vị trí m đến vị trí n. Nếu bạn bỏ qua chỉ số thứ nhất (trước dấu hai chấm) thì lát cắt sẽ bắt đầu ở ngay điểm đầu của chuỗi. Nếu bạn bỏ qua chỉ số thứ hai thì lát cắt sẽ kết thúc ở điểm cuối của chuỗi:

Code:
>>> fruit = 'banana'

>>> fruit[:3]
'ban'
>>> fruit[3:]
'ana'
Chú ý: Mặc dù các bạn có thể truy cập và duyệt từng kí tự của 1 chuỗi, nhưng do kiểu String là kiểu dữ liệu cố định nên nếu bạn muốn sử dụng cú pháp bên dưới để thay đổi 1 kí tự của chuỗi sẽ gây ra lỗi.
Code:
>>> chuoi[3] = 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Nếu các bạn muốn đảo ngược 1 xâu, các bạn làm thế nào? Cách đơn giản nhất là tạo 1 xâu khác, duyệt xâu kia theo chiều từ phải qua trái và nối nó vào xâu tạo ra. Nhưng cách này nghe vẻ rất lâu và mất nhiều thời gian. Mình xin trình bày cho các bạn một cách đảo ngược chuỗi cực nhanh nhé.

Code:
>>> chuoi = 'abcdefgh'
>>> trung_gian = chuoi[::-1]
>>> chuoi = ''.join(trung_gian)
>>> chuoi
'hgfedcba'
Như các bạn thấy ở trên, chuỗi được đảo ngược chỉ với vài lệnh đơn giản mà không cần đến vòng lặp. Việc này giảm thiểu 1 số thời gian xử lý cho chương trình của bạn đó :D.

2. Các phương thức của chuỗi (String)
Ở phần này, chúng ta sẽ đi xem xét các phương thức của chuỗi, cho phép chúng ta xử lý chuỗi nhanh hơn. Mình sẽ điểm qua vài phương thức chính hay sử dụng:

Code:
>>> word = 'banana'

>>> new_word = word.upper()
>>> print new_word
BANANA
Phương thức upper() ở trên trả lại toàn bộ kí tự của chuỗi đổi kí tự in hoa. Ngược lại với phương thức upper() ta có phương thức lower() sẽ trả lại chuỗi với toàn bộ kí tự in thường.

Code:
>>> word = 'banana'

>>> index = word.find('a')
>>> print index
1
Phương thức find() cho phép chúng ta tìm kiếm vị trí đầu tiên của kí tự được truyền vào làm tham số của find() trong chuỗi đã cho. Ngoài ra, nó còn có thể tìm 1 chuỗi con, hay là bắt đầu tìm từ vị trí bao nhiêu và dừng tìm ở vị trí nào.
Code:
>>> word.find('na')
2
>>> word.find('na', 3)
4
>>> word.find('na',1,3)
-1
Ở lần tìm thứ 3, do 'na' không có trong chuỗi ở vị trí 1,3 nên nó trả lại -1, tức là không tìm thấy. Tiếp theo, để đếm 1 kí tự xuất hiện bao nhiêu lần trong chuỗi, ta sẽ sử dụng phương thức count().

Code:
>>> word.count('a')
3
Bài học hôm nay kết thúc tại đây. Các bạn nên tìm hiểu thêm về các phương thức của chuỗi (String) nhé. Mình chỉ có duy nhất 1 bài tập cho các bạn ở bài này. Hãy giải quyết nó nhanh nhé:
  • Các hàm sau đây đều dự kiến nhằm mục đích kiểm tra xem liệu một chuỗi có bao gồm chữ cái viết thường không, nhưng ít nhất một vài trong số đó bị sai. Với mỗi hàm, hãy mô tả xem tác dụng thực sự của nó là gì (với giả thiết rằng tham biến truyền vào là một chuỗi). Nói rõ vị trí sai, tại sao sai nhé :D
Code:
   
    def any_lowercase1(s):
        for c in s:
            if c.islower():
                return True
            else:
                return False

    def any_lowercase2(s):
        for c in s:
            if 'c'.islower():
                return 'True'
            else:
                return 'False'

    def any_lowercase3(s):
        for c in s:
            flag = c.islower()
        return flag

    def any_lowercase4(s):
        flag = False
        for c in s:
            flag = flag or c.islower()
        return flag

    def any_lowercase5(s):
        for c in s:
            if not c.islower():
                return False
        return True



No comments:

Post a Comment