Menu

Python: Kiểu dữ liệu chuỗi

Kiểu chuỗi
Chuỗi là kiểu dữ liệu có mặt trong tất cả các ngôn ngữ lập trình và các thao tác trên chuỗi cũng được sử dụng rất thường xuyên. Chính vì vậy, bài này ta sẽ đi tìm hiểu tất cả mọi thứ về chuỗi trong Python.

Khai báo chuỗi

Việc khai báo một chuỗi trong Python vô cùng đơn giản. Bạn chỉ cần đặt chuỗi đó trong cặp dấu nháy kép như sau:
str1 = 'Hello World'
str2= "I'm Vietnamese"
Vậy là chúng ta đã khai báo được hai chuỗi và gán nó vào hai biến str1str2. Ta có thể in nó ra màn hình xem có đúng không bằng lệnh đơn giản như sau:
print(str1);
print(str2);
Trên màn hình sẽ hiện ra hai chuỗi là Hello World và I'm Vietnamese, vậy là ta đã thực hiện được một thao tác đơn giản đó là khai báo chuỗi và in ra mành hình chuỗi đã được khai báo. Bạn cũng quan sát một chút, chuỗi thứ nhất được đặt trong cặp dấu ngoặc đơn, chuỗi thứ hai được đặt trong dấu ngoặc kép. Bạn có thể xem code tại đây.

Các thao tác trên chuỗi

  • Truy cập đến các ký tự trong chuỗi: Python không có kiểu ký tự, chính vì thế ta không thể truy cập đến từng ký tự của một chuỗi và đối với Python thì một ký tự (theo nghĩa của ngôn ngữ khác) cũng là một chuỗi. Chính vì thế, ta quan tâm ở đây là truy cập đến các chuỗi con của một chuỗi.
    • Truy cập một "phần tử": Việc truy cập đến từng "phần tử" của chuỗi trong Python giống việc truy cập đến các phần tử của mảng trong C, Java. Ví dụ: print(str1[0]) sẽ in ra màn hình chuỗi "H"
    • Truy cập một chuỗi con: Python cho phép chúng ta truy cập đến nhiều phần tử bằng việc cung cấp chỉ số đầu và chỉ số cuỗi của chuỗi con ta muốn truy cập. Ví dụ: print(str1[6:10]) sẽ in ra màn hình chuỗi "World". Chúng ta thấy, ở đây có toán tử chỉ đoạn từ chỉ số đầu đến chỉ số cuỗi. Ta có thể viết viếu 1 trong hai chỉ số đầu hoặc cuối. Ví dụ print (str1[:5]) sẽ in ra màn hình nội dung chuỗi con từ đầu đến vị trí thứ 5 ở chuỗi ban đầu.
    • Truy cập chuỗi con từ phải sang: thông thường, ta thấy các chuỗi sẽ đánh số các ký tự từ 0 cho đến hết. Ví dụ chuỗi str1 sẽ được đánh số như sau:
      H e l l o   W o r l  d
      0 1 2 3 4 5 6 7 8 9 10
      Ở đây, python lại có một cách khác được thực hiện như sau
      H    e   l  l  o     W  o  r  l  d
      -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
      Với cách đánh số như thế này, chữ 
      Hello World sẽ tương đương với str1[-11:-1]. Chữ World sẽ tương đương với str1[-5:-1] hoặc str1[-5:]. Như vậy, thật dễ dàng nếu chúng ta muốn lấy các chuỗi con từ phải sang trái.
  • Phép nối chuỗi (Concatenation): Là một phép toán được sử dụng thường xuyên. Vì tính đơn giản của mình nên Python định nghĩa phép nối chuỗi được thực hiện bởi toán tử +. Ví dụ:
    str3 = str1+str2
    Ở ví dụ trên, ta được chuỗi str3 có nội dung như sau: "Hello WorldI'm Vietnamese". Bạn lưu ý là không có dấu cách ở giữa hai chuỗi được nối đâu nhé. Muốn có dấu cách ở giữa bạn phải làm như sau:
    str3 = str1 + " " + str2
    Ở đây, str3 là kết quả của phép cộng 3 chuỗi nhé (chuỗi str1, str2 và chuỗi vô danh " ")
  • Phép nhân (Repetition): Thực ra gọi là phép nhân cũng không đúng, mà phải gọi là phép lặp. Tức là ta có thể tạo một chuỗi mới bằng cách lặp đi lặp lại một chuỗi đã có. Ví dụ:
    str4 = str1*3
    Vậy, kết quả chuỗi str4 là gì? Hẳn bạn sẽ đoán ra ngay. Chuỗi str4 sẽ là: Hello WorldHello WorldHello World.
  • Phép in: phép này dùng để kiểm tra một chuỗi đã cho có phải là chuỗi con của một chuỗi khác không? Giả sử, ta có chuỗi str5 = "He"str6 = "US". Ta sẽ kiểm tra xem str5 và str6 có xuất hiện trong str2 hay không bằng các lệnh đơn giản sau:
    testin1 = str5 in str2

    if testin1 == True:

        print( str5, " in ", str2)

    else :

        print( str5, " not in ", str2)



    testin2 = str6 in str2

    if testin2 == True:

        print( str6, " in ", str2)

    else:

        print( str6, " not in ", str2)
    Bạn chạy thử chương trình và sẽ thấy kết quả như sau:
    Viet  in  I'm Vietnamese
    US  not in  I'm Vietnamese
    Từ Viet có xuất hiện trong str2 nên kết quả của phép toán là True ngược lại, từ US không xuất hiện trong str2 nên kết quả là False.
  • Phép not in: phép toán này ngược với phép toán in có điều mình không hiểu Python đơn giản, thì tại sao lại đưa thêm phép toán này vào. Vì thực chất sử dụng phép toán in thì sẽ được cả kết quả của phép toán not in cơ mà (ai giải thích hộ với?).
  • Phép R/r: sử dụng hai ký tự này trước các chuỗi sẽ cho phép bỏ qua các ký tự điều khiển. Ví dụ như sau:
    print("Dau xuong dong \n")
    print(r"Dau xuong dong \n")
    print(R"Dau xuong dong \n")
    Giờ hay quan sát kết quả. Bạn thấy sao? Hai dòng cuối vẫn in ra dấu \n đúng không nào? Có nghĩa là: thêm r hoặc R vào đầu chuỗi thì chuỗi có như thế nào sẽ có nội dung đúng như thế. Còn trường hợp ngược lại, không có rR thì \n được coi là một "ký tự"

Định dạng chuỗi

Việc có phép toán nối chuỗi trong Python đã làm tăng khả năng xử lý chuỗi rất nhiều. Tuy nhiên, việc sư dụng định dạng chuỗi cũng có rất nhiều ưu điểm. Ta xét một ví dụ sau đây: Giả sử, muốn in ra một danh sách các sinh viên, mỗi sinh viên sẽ có các thôn tin gồm mã sinh viên (code - chuỗi), họ và tên (fullname - chuỗi), giới tính (gender - boolean), ngày sinh (birthday - chuỗi) và địa chỉ (address - chuỗi). Như vậy, ta muốn in ra thôn tin của 1 sinh viên sẽ như sau:
info = code + " " + fullname + " " +  ("Nam" if gender == True else "Nu") + " " + birthday + " " + address.
Như vậy, ta thấy có tất cả 8 phép toán cộng chuỗi. Rõ ràng sẽ làm giảm hiệu suất của chương trình và dễ nhầm lẫn cho người lập trình. Thay vào đó, bạn hãy xem cách sau đây nhé:
info = "%s %s %s %s %s" % (code, fullname,("Nam" if gender == True else "Nu"), birthday, address)
Với cách này, rõ ràng chuỗi mẫu được ta định sẵn. Giả sử, thay vì các thông tin của sinh viên cách nhau một dấu cách, mà ta muốn cách nhau 1 dấu Tab thì ta sẽ sửa lại từng vị trí, với cách 1 rõ dàng là dễ nhầm lẫn hơn.
Chúng ta thấy ở cách thứ 2 có các dấu %s. Nó được gọi là biểu tưởng định dạng (format symbol). Ta có danh sách như sau:
Biểu tượng Ý nghĩa
%c Định dạng cho ký tự
%s Định dạng cho chuỗi
%i Định dạng cho số nguyên có dấu
%d Định dạng cho số nguyên dài (long) có dấu
%u Định dạng cho số nguyên không dấu
%o Định dạng cho số ở hệ bát phân (octan)
%x Định dạng cho số ở hệ hexan (16), các ký tự viết thường như 8ab
%X Định dạng cho số ở hệ hexan, các ký tự viết hoa như 8AB
%e Định dạng số dưới dạng số mũ (với chữ e viết thường)
%E Định dạng số dưới dạng số mũ (với chữ E viết thường)
%f Định dạng cho số thực dấu phẩy động
Ngoài các định dạng chính ở trên, chúng ta còn có một số định dạng bổ sung cho các kiểu số, để giúp chúng ta định dạng in trong các màn hình console hoặc in lên các bill (của siêu thị). Theo mình, ngày nay chúng ta ít khi sử dụng đến định dạng này vì có những tiện ích giúp chúng ta làm tốt hơn. Nhưng tốt hơn hết là bạn tự tìm hiểu thì sẽ nhơ được lâu.
Một số ký tự đặc biệt:
Như mọi ngôn ngữ lập trình khác, Python cũng có các ký tự đặc biệt được dùng để điều khiển. Bạn lưu ý, trong số này có thể chỉ làm việc đối với màn hình console chứ không làm việc với console trên eclipse. Do đó, nếu bạn muốn thử các ký tự này thì tốt hơn hết là chạy chương trình bằng giao diện console nhé.

Ký tự Ý nghĩa Ví dụ
\a Cảnh bảo. Tạo một tiếng kêu hệ thống để cảnh báo print("Mothership was attacked\a\a\a")
In ra thông báo và phát ra 3 tiếng kêu
Rất có thể bạn không nghe thấy tiếng gì cả vì máy tính của bạn không có loa hệ thông (không phải loa nghe nhạc đâu nhé)
\b Xóa ký tự ngay phía trước. Chính là nút backspace trên bàn phìm của chúng ta. print ("Hello\b\b")
Có phải mất chứ 'o' không nhỉ?
\n Xuống dòng mới (Enter) print("Hello\nWorld")
Bạn thấy gì nào? Hello và World ở trên 2 dòng khác nhau đúng không?
\r Trở lại đầu dòng hiện tại print("Hello\rA")
Chạy lệnh trên bạn được gì nào? Aello đúng không? Ở đây, sau khi in xong Hello ra màn hình, gặp phải ký tự \r sẽ trở về đầu dòng và lúc này tiếp tục ghi ra màn hình chữ A. Mà con trỏ màn hình thì đang ở đầu dòng nên chữ H sẽ được ghi đè bởi chữ A
\t In ra màn hình một dấu Tab print("Hello\t\tWorld")
Rõ ràng hai chữ Hello và World cách nhau khá xa nhé (tận 2 dấu tab cơ mà)
Còn một số ký tự nữa, tự tìm hiểu nhé

Một số hàm trên chuỗi

Python là một ngôn ngữ lập trình hướng đối tượng. Chính vì thế, chuỗi cũng là một đối tượng. Vậy khi áp dụng một hàm ta sẽ làm như sau:
Giả sử có biến:
str1 = 'Hello World'
Ta muốn "chuyển" chuỗi str1 thành chuỗi chữ hoa thì ta sử dụng phương thức upper như sau:
str2 = str1.upper()
Ta in str1str2 ra màn hình thì thấy str1 vẫn như cũ còn str2 được viết hoa tất cả các ký tự của str1. Như vậy, chữ chuyển ở đây không có nghĩa str1 được chuyển thành chữ hoa mà chỉ có kết quả của phương thức upper sẽ copy các ký tự của str1 và chuyển thành chữ hoa hết rồi gán lại cho str2.
Tương tự cho các hàm khác bạn có thể tham khảo các hàm của chuỗi tại địa chỉ này.

Kết luận

Như vậy, chuỗi trong Python cũng tương tự như chuỗi trong các ngôn ngữ lập trình khác. Các tốt nhất để bạn làm quen với chuỗi và làm bài tập. Bài tập rất đơn giản thôi. Nhập vào tên một người (chữ hoa, chữ thường lẫn lộn) hãy chuẩn hóa lại tên đó. Chuẩn hóa nghĩa là cắt bỏ phần ký tự trằng ở đầu và ở cuối, giữa các từ nếu có nhiều ký tự trằng thì xóa đi và chỉ giữ lại 1 ký tự cách. Đầu mỗi từ phải viết hoa còn các ký tự ở trong từ thì viết thường.
Sau khi làm xong bài trên, thì bạn quá tự tin vào khả năng của mình rồi. Hãy đầu tư chút đỉnh thời gian nha!

Không có nhận xét nào:

Đăng nhận xét