Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python Strings: Một trong những kiểu dữ liệu phổ biến nhất của Python

Python Strings: Một trong những kiểu dữ liệu phổ biến nhất của Python

Chuỗi (Strings) là một trong những kiểu dữ liệu phổ biến nhất trong Python. Ở mức độ cao, chuỗi là một đối tượng bao gồm một chuỗi ký tự. Ký tự là một ký hiệu — ví dụ tiếng Anh có 26 ký tự trong bảng chữ cái.

Python strings dễ tạo thao tác. Bạn có thể ngay lập tức bắt đầu học làm như vậy. Bài viết này xem xét strings trong Python, cách chúng hoạt động, và các phép toán phổ biến dùng trên chúng.

Chuỗi (Strings) trong Python là gì? 

Bạn có thể tạo chuỗi trong Python đơn giản bằng cách đặt ký tự trong dấu ngoặc kép — có thể là dấu nháy đơn (') hoặc dấu nháy kép ("). Khởi tạo và khai báo chuỗi bằng cách gán nó cho biến:

doubleQuoteString = "I'm a string"
singleQuoteString = 'I\'m a string' # cần escape dấu nháy đơn để xem nó là giá trị chuỗi thay vì kết thúc đầu vào. 

Nhớ: nếu bạn cần dùng dấu nháy đơn bên trong chuỗi được bao quanh bởi dấu nháy đơn, ta cần escape nó bằng \. Điều này sẽ xem dấu nháy như một phần của chuỗi thay vì kết thúc chuỗi.

Docstrings và Chuỗi nhiều dòng

Docstrings là loại chuỗi khác trong Python. Chúng được bao quanh bởi ba dấu nháy kép ("""""") và được xem như comment nhiều dòng ở dòng đầu tiên của hàm hoặc lớp. 

def printString(str):
    ''' nhận một chuỗi và in ra màn hình '''
    print(str)

Docstring mô tả mục đích của khối mã. Nếu bạn muốn dùng docstring trong logic, bạn có thể gán docstring cho biến. Nếu gán cho biến, docstring trở thành chuỗi nhiều dòng.

multiline = ''' 
I'm a multi-line string that can be assigned to a variable. 
The format follows exactly the way YOU input it. 
''' 
print(multiline)

Chuỗi nhiều dòng sẽ tuân theo định dạng bên trong ba dấu nháy. Không có gán biến, chuỗi sẽ được xem như comment và bị bỏ qua.

Raw Strings (Chuỗi thô)

Python dùng khái niệm raw strings. Khái niệm này xem mọi thứ bên trong chuỗi theo cách bạn viết — dấu gạch chéo ngược (\), đặc biệt, không được dùng như chuỗi escape. Đây là so sánh:

notRaw = "I'm a not a raw string, and escape chars DO matter \n\r\t\b\a"
rawString = r"I'm a raw string, where escape chars don't matter \n\r\t\b\a"
print(notRaw) # I'm not a raw string, and escape chars DO matter.
print(rawString) # I'm a raw string, where escape chars don't matter \n\r\t\b\a

Raw string được biểu diễn bằng chuỗi thông thường có tiền tố chữ r: 

r"This is a raw string"

Dùng raw string khi bạn cần dấu gạch chéo ngược không chỉ thị chuỗi escape đặc biệt nào.

Ký tự Unicode trong chuỗi

Unicode là đặc tả ký tự có mục tiêu gán cho mọi ký tự được dùng bởi bất kỳ ngôn ngữ nào mã riêng. Trong hầu hết tài liệu, giá trị unicode được biểu diễn bằng: 

U+<giá trị hex unicode>  ⇒ U+2661 ⇒ ♡ 

U+2661 là ví dụ một loại ký tự unicode có sẵn cho ta dùng. Có hàng chục nghìn ký tự để chọn đại diện cho tất cả ngôn ngữ trên thế giới.

Viết Unicode trong Python 3

Để viết ký tự unicode trong Python 3, dùng chuỗi escape trong chuỗi thông thường bắt đầu bằng \u và kết thúc bằng mã gán cho ký tự (số sau dấu +).

unicodeString = '\u2661'
print(unicodeString) # ♡ 

Bạn có thể nối nhiều ký tự unicode liên tiếp. 

Quá trình dùng unicode trong chuỗi thông thường này cập nhật từ Python 2. Ở phiên bản cũ, bạn phải có chuỗi unicode riêng biệt bắt đầu bằng u'\u<số unicode>' vì Python 2 dùng giá trị ASCII và unicode.

Cách truy cập giá trị trong Chuỗi

Ta dùng ngoặc vuông để truy cập giá trị trong chuỗi trong Python. Chuỗi là zero-based (chỉ số từ 0) tương tự ngôn ngữ lập trình khác. Nghĩa là ký tự đầu tiên trong chuỗi bắt đầu ở chỉ số 0.

hello = "hello world"
print(hello[4]) # o

In chỉ số 4 trong hello sẽ in "o" ra màn hình. Nếu bạn truy cập chỉ số không thuộc chuỗi, bạn sẽ thấy IndexError: string index out of range. Lỗi này nghĩa là bạn truy cập chỉ số lớn hơn hoặc nhỏ hơn số chỉ số bạn có.

Lưu ý:  Nếu bạn đến từ ngôn ngữ như C hoặc Java, bạn quen với ký tự có kiểu dữ liệu riêng. Điều này không đúng trong Python — các ký tự riêng lẻ đơn giản được xem như chuỗi con (substring) có độ dài một. 

Truy cập nhiều ký tự trong Chuỗi

Dùng cắt lát chuỗi (string slicing) để truy cập nhiều ký tự cùng lúc. Cú pháp:

string_name[first_index? : another_index?]

Chỉ số cuối cùng là non-inclusive (không bao gồm). Hello[1:3] trong ví dụ trước trả về el chứ không phải ell. 

Điều thú vị về slicing trong Python là giá trị chỉ số không bắt buộc để cắt. 

Dưới đây là các cách phổ biến cắt chuỗi trong Python:

  • string_name[:]

    Dùng dấu hai chấm trong ngoặc vuông sẽ cắt toàn bộ chuỗi tạo bản sao.
hello = "hello world"
copy = hello[:] + " ⇐ whole string"
print(copy) # hello world ⇐ whole string
  • string_name[first_index:]

    Bạn có thể cắt từ chỉ số trong chuỗi đến cuối mà không cần biết chỉ số cuối bằng cách để trống trong ngoặc vuông.  
hello = "hello world"
copy = hello[2:] + " ⇐ An index to end of string"
print(copy) # llo world ⇐ An index to end of string
  • string_name[:second_index]

    Cắt từ đầu đến chỉ số khác bằng cách để trống vị trí chỉ số đầu trong ngoặc vuông.
hello = "hello world"
copy = hello[:7] + " ⇐ beginning to index inside of string"
print(copy) # hello w ⇐ beginning to index inside of string
  • string_name[first_index:second_index]

    Nhớ rằng phương thức slice là non-inclusive nếu bạn có hai chỉ số cụ thể muốn cắt. Vì vậy nếu muốn chuỗi từ chỉ số 1 đến 6, bạn thực tế muốn định dạng hello[1:7].
hello = "hello world"
copy = hello[1:7] + " ⇐ first index to another index"
print(copy) # ello w ⇐ beginning to another index inside of string

Số âm cũng có thể dùng:

hello = "hello world"
copy = hello[-7:-2] + " ⇐ negative indexes"
print(copy) # o wor ⇐ negative indexes

Dùng string slicing tuyệt vời khi bạn muốn thao tác chuỗi, nhưng không biến đổi chuỗi gốc. Nó tạo bản sao trong bộ nhớ của các chỉ số chọn để bạn cập nhật mà không thay đổi chuỗi gốc.

Cách lặp qua Chuỗi trong Python

Trong Python, ta xử lý chuỗi rất giống cách xử lý mảng. Ta có thể lặp qua chuỗi như làm với mảng dùng cú pháp for...in:

#for...in syntax
for  in :
    #do logic here
#example
word = "career karma"
for letter in word:
    print(letter) #prints each individual letter on each iteration

Ta gán 'letter' cho và 'word' cho để lặp qua "career karma". Mỗi lần lặp, nó in ký tự tại lần lặp đó ra màn hình.

Cách tìm độ dài Chuỗi

Để tìm độ dài chuỗi, dùng phương thức len(). 

lenExample = "The quick brown fox jumps over the lazy dog."
print(len(lenExample))

Đừng dùng từ khóa len nơi khác trong mã. Trình thông dịch sẽ nhầm hàm với biến đặt tên của bạn.

Cách dùng in và not in

Bạn có thể dùng từ khóa in và not in với chuỗi Python để kiểm tra xem cái gì đó có chứa trong chuỗi không.

checkString = "Career Karma will help you make a career switch to the tech industry"

checkString là chuỗi ta dùng cho hai ví dụ tiếp theo.

Dùng in

Từ khóa in có thể dùng kiểm tra xem cái gì đó có trong chuỗi không bằng cách nói với trình thông dịch Python bạn muốn biết từ khóa tìm kiếm có trong chuỗi gán cho biến.

print("tech" in checkString) # True

Python là ngôn ngữ đáng học vì dễ đọc. Cú pháp ở đây về cơ bản là cách bạn hỏi câu hỏi đó nếu hỏi người khác:

Q: "Có 'tech' trong checkString không?" ("tech" in checkString)

      (quét chuỗi)

A: "Có, có nó." (True)

Dùng not in

Cụm từ khóa not in kiểm tra xem cái gì đó KHÔNG có trong chuỗi. Điều này có thể gây nhầm lẫn, nên chú ý. Ở đây, khi bạn hỏi xem cái gì đó có không trong chuỗi, nó trả về "True" nếu nó không trong chuỗi, hoặc "False" nếu nó có trong chuỗi.

print("tech" not in checkString) # False

Đây là cách ta đọc cú pháp nếu nói chuyện với người khác:

Q: "'tech' có không trong checkString?" ("tech" not in checkString)

      (quét chuỗi)

A: "Không. Từ 'tech' có trong checkString" (False)

Chúng ta có thể thay đổi cấu trúc Chuỗi không? 

Chuỗi trong Python là bất biến (immutable). Các ký tự cấu thành chuỗi không thể biến đổi hoặc thay đổi sau khi gán ban đầu.

delString = "Can we delete this or change this?"
delString[2] = "b"
print(delString)

Thử chạy mã này trong trình thông dịch Python. Lỗi sau sẽ xảy ra:

Traceback (most recent call last):
File "main.py", line no., in 
delString[2] = "b"
TypeError: 'str' object does not support item assignment

TypeError ở đây nói cho ta biết chuỗi trong Python không cho phép gán lại ký tự. Bạn cần gán lại toàn bộ chuỗi thành chuỗi mới bạn muốn tạo nếu muốn gán lại ký tự riêng lẻ.

delString = delString[:2] + "b" + delString[3:]
print(delString)

Mã ở đây là cách đúng để làm điều ta định làm với dòng delString[2] = "b". Cần gán lại toàn bộ để thay đổi đối tượng chuỗi. 

Điều này cũng nghĩa là xóa ký tự đơn lẻ trong chuỗi không thể. Bạn có thể, tuy nhiên, xóa toàn bộ chuỗi với từ khóa del.

del delString
print(delString) #sẽ trả lỗi hoặc linter sẽ bắt là undefined

Phương thức chuỗi phổ biến

Có một số phương thức liên quan đến chuỗi Python. Danh sách cập nhật nhất, xem Python docs. 

Dưới đây là một số phương thức phổ biến nhất. testString là chuỗi mẫu dùng minh họa hầu hết phương thức.

testString = "this is a test string."

capitalize()

Phương thức capitalize viết hoa chữ cái đầu của chuỗi:

capitalized = testString.capitalize()
print(capitalized) # This is a test string

find()

Phương thức built-in này trả về chỉ số nơi đối số truyền vào bắt đầu. Nếu không tìm thấy, trả về -1.

found = testString.find("test")
notfound = testString.find("not")
print(found) # 10
print(notfound) # -1

join()

Phương thức join nhận đối tượng iterable truyền vào (có thể là chuỗi, set, tuple, hoặc list), lặp qua nó, và thêm phân tách chuỗi mà phương thức được gọi. Ví dụ:

separator = ", " # this is our separator - this is the string that the method gets called on
numbers = "123" # this is our iterable. In this instance, it is a string
joinedByComma = separator.join(numbers)
print(joinedByComma) # 1, 2, 3

Thử chơi với phương thức join xem bạn có thể làm gì với iterables khác như list, set, hoặc tuple!

lower() và upper()

Hai hàm built-in lower và upper xử lý chữ hoa/chữ thường của chuỗi. Lower tạo bản sao chuỗi toàn bộ chữ thường; upper tạo bản sao toàn bộ chữ hoa: 

uppercase = testString.upper()
print(uppercase) # THIS IS A TEST STRING
lowercase = testString.lower()
print(lowercase) # this is a test string

Đây chỉ là một vài phương thức bạn có thể dùng khi thao tác chuỗi. Sau khi nắm vững những này, hãy xem các phương thức chuỗi Python khác như split(), replace(), title(), và swapcase(). 

Kết luận

Trong bài viết này, ta xem xét chuỗi Python là gì, cách dùng, và một số phương thức built-in có sẵn. Sau khi thành thạo hướng dẫn này, hãy xem bài về định dạng chuỗi trong Python để học sâu hơn!