Học bằng cách đọc theo thứ tự

Cách sử dụng chuỗi (str) trong Python

Học cách dùng kiểu chuỗi str trong Python: cắt chuỗi, biến đổi và kiểm tra nội dung qua các phương thức thông dụng.

Tạo một chuỗi

Chuỗi (str) là kiểu dữ liệu biểu diễn một "dãy ký tự". Trong Python, bất kỳ giá trị nào được bọc trong dấu nháy đều là str.

Có ba cách bọc chuỗi, và bạn chọn cách phù hợp với tình huống của mình.

Ba cách viết dấu nháy
'apple'NháyđơnChuỗi một dòng"apple"NháyképDễ nhúngdấu ' bên trong"""..."""NháybaGiữ nhiều dòngnhư nguyên bảnxác định kiểudùng choxác định kiểudùng choxác định kiểudùng cho

Cả ba cách đều tạo ra cùng kiểu str.

Việc chọn cách nào phụ thuộc vào "ký hiệu nào xuất hiện bên trong văn bản" và "bạn có cần xuống dòng hay không".

Khi bạn muốn thêm dấu xuống dòng, bạn có thể dùng chuỗi escape \n hoặc bọc văn bản trong dấu nháy ba.

# Nháy đơn/nháy kép dùng cho chuỗi một dòng
fruit1 = 'apple'
fruit2 = "banana"

# Khi văn bản chứa ', dùng " để bọc sẽ dễ hơn
message = "it's a pen"

# Để thêm xuống dòng -> dùng \n hoặc nháy ba
text_a = "apple\nbanana\ngrape"
text_b = """apple
banana
grape"""

print(fruit1, fruit2)  # apple banana
print(message)         # it's a pen
print(text_a)          # hiển thị trên 3 dòng
print(text_b)          # kết quả giống text_a

Hãy thử cả ba loại dấu nháy trong console.

① Tạo name = "Alice"message = 'Hello', rồi print() cả hai.

② Dùng \n, lưu "apple", "grape" và "lemon" vào một biến duy nhấtprint() sao cho hiển thị trên 3 dòng.

③ Dùng nháy ba ("""), lưu "apple", "grape" và "lemon" vào một biến duy nhấtprint() sao cho hiển thị trên 3 dòng.

Python Editor

Chạy code để xem đầu ra

Lấy ký tự theo vị trí (index và slice)

Bạn cũng có thể lấy các ký tự từ chuỗi theo vị trí (index).

Điều quan trọng là index bắt đầu từ 0. Ký tự đầu tiên không phải là "vị trí 1" — nó là vị trí 0.

Lấy một ký tự — [i]

Viết chuỗi[vị trí] để lấy một ký tự tại vị trí đó.

Dùng số âm để đếm từ cuối. -1 là ký tự cuối cùng.

fruit = "lemon"  # l e m o n

print(fruit[0])   # l  (đầu tiên)
print(fruit[2])   # m  (thứ 3)
print(fruit[-1])  # n  (cuối cùng)
print(fruit[-2])  # o  (thứ 2 từ cuối)

# Vượt quá phạm vi sẽ gây lỗi
# print(fruit[10]) # IndexError
Cách đếm index
lemon01234-5-4-3-2-1

word = "python" đã được định nghĩa sẵn.

① In cả ký tự đầu tiênký tự cuối cùng của word bằng print().

② In ký tự ở giữa (ký tự thứ 4) của word, đếm từ đầu.

Python Editor

Chạy code để xem đầu ra

Lấy một phạm vi — slice với [a:b]

Viết chuỗi[bắt đầu:kết thúc] để lấy mọi thứ từ vị trí bắt đầu cho đến, nhưng không bao gồm, vị trí kết thúc. Cái này gọi là slice.

Điểm quan trọng là phạm vi nửa mở — "tới một vị trí trước kết thúc". [0:3] cho bạn vị trí 0, 1 và 2 (ba ký tự), và không bao gồm 3.

Cách slice hoạt động
msg= '0123456789'msg[0:3]= '012'msg[:4]= '0123'msg[4:]= '456789'msg[-3:]= '789'msg[:-3]= '0123456'msg[::2]= '02468'a:b:-na:-n:::step

[a:b] bao gồm a và loại trừ b.

Bỏ a để bắt đầu từ đầu; bỏ b để đi đến cuối.

Số âm cũng dùng được — [-3:] là 3 ký tự cuối.

msg = "0123456789"

print(msg[0:3])    # '012'   (không bao gồm 3)
print(msg[:4])     # '0123'  (từ đầu)
print(msg[4:])     # '456789'(đến cuối)
print(msg[-3:])    # '789'   (3 ký tự cuối)
print(msg[:-3])    # '0123456'(tất cả trừ 3 ký tự cuối)

Bạn cũng có thể thêm số thứ ba — [bắt đầu:kết thúc:bước] — để chọn cách quãng (ví dụ cách một hoặc cách vài ký tự). [::2] lấy mỗi ký tự thứ hai.

Tuy nhiên, nhồi bước và phạm vi vào cùng một dòng sẽ khó đọc, nên đối với slice dài, nên tách thành hai dòng.

msg = "0123456789"

# [::bước] nhảy qua chuỗi
print(msg[::2])       # '02468' (cách một)
print(msg[::3])       # '0369'  (cách hai)

# Tách bước thành dòng riêng dễ đọc hơn
head = msg[:6]        # '012345'
skip = head[::2]      # '024' (cách một)
print(skip)

email = "alice@example.com" đã được định nghĩa sẵn.

① Dùng slice để lấy tên người dùng trước @ — tức là chỉ "alice" — và in ra (@ ở vị trí 5).

② Dùng [-3:] để lấy 3 ký tự cuối "com" và in ra.

Python Editor

Chạy code để xem đầu ra

Các phương thức biến đổi chuỗi

Chuỗi có sẵn các tính năng tạo ra chuỗi mới dựa trên chuỗi gốc, và chúng được gọi là phương thức.

Bạn gọi một phương thức bằng cách viết biến.tên_phương_thức(). Điểm quan trọng là chuỗi gốc không bao giờ bị thay đổi — một chuỗi mới được trả về.

Phương thức trả về chuỗi mới
name= 'alice'.upper()'ALICE'giá trị mớigọitrả về

Chuyển hoa/thường — upper / lower

upper() chuyển thành tất cả chữ hoa, và lower() chuyển thành tất cả chữ thường.

Cách dùng phổ biến nhất là so sánh chuỗi mà bỏ qua hoa/thường. Tên và email do người dùng nhập thường có hoa/thường lộn xộn, nên bạn chuẩn hóa cả hai bên về cùng một dạng trước khi so sánh.

name = "Alice"

print(name.lower())    # alice
print(name.upper())    # ALICE
print(name)            # Alice  (chuỗi gốc không đổi)

# Kiểm tra hai tên có khớp không, bỏ qua hoa/thường
input_a = "ALICE"
input_b = "alice"
print(input_a.lower() == input_b.lower())  # True

Thay thế nội dung và cắt đầu cuối — replace / strip

replace("cũ", "mới") trả về một chuỗi mới trong đó mỗi "cũ" đã được thay bằng "mới".

strip() là phương thức loại bỏ khoảng trắng ở cả hai đầu. Nó hoàn hảo để dọn dẹp những khoảng trắng thừa mà người dùng vô tình dán vào form.

Cách replace và strip hoạt động
'Hello World'.replace('World','Python')'Hello Python'' hi '.strip()'hi'gọiđã thaygọiđã cắt
greeting = "Hello World"
print(greeting.replace("World", "Python"))  # Hello Python
print(greeting)                             # Hello World (chuỗi gốc không đổi)

# Cắt khoảng trắng thừa (chỉ ở hai đầu — khoảng trắng bên trong vẫn giữ)
raw = "  alice@example.com  "
print(raw.strip())        # 'alice@example.com'
print(len(raw))           # 21 (gồm cả khoảng trắng)
print(len(raw.strip()))   # 17 (khoảng trắng đã bị loại bỏ)

Hãy dọn dẹp một địa chỉ email do người dùng nhập.

raw_email = " ALICE@Example.COM " đã được định nghĩa sẵn.

② Dùng strip() để loại bỏ khoảng trắng ở hai đầulower() để chuyển văn bản về chữ thường, rồi lưu email đã làm sạch vào clean_email.

③ Dùng print() để hiển thị cả bản gốc (raw_email) và bản đã làm sạch (clean_email).

Python Editor

Chạy code để xem đầu ra

Các phương thức kiểm tra chuỗi

Tiếp theo là các phương thức không thay đổi giá trị — chúng chỉ cho bạn biết điều gì đó về chuỗi.

Chúng đếm số lần xuất hiện của ký tự, kiểm tra đầu hoặc cuối, tìm vị trí, và kiểm tra loại ký tự nào có bên trong.

Kiểm tra nội dung bên trong — count / startswith / endswith / find

  • count("văn bản") — trả về bao nhiêu lần văn bản xuất hiện, dưới dạng một số
  • startswith("văn bản") — trả về chuỗi có bắt đầu bằng văn bản không (True / False)
  • endswith("văn bản") — trả về chuỗi có kết thúc bằng văn bản không (True / False)
  • find("văn bản") — trả về vị trí của lần khớp đầu tiên. Nếu không tìm thấy, trả về -1
msg = "abcCBAabc"

print(msg.count("a"))          # 3  (có 3 chữ a)
print(msg.count("abc"))        # 1  ('abc' chỉ xuất hiện liền một lần)

print(msg.startswith("abc"))   # True
print(msg.endswith("abc"))     # True

print(msg.find("CBA"))         # 3  (bắt đầu ở vị trí 3)
print(msg.find("xyz"))         # -1 (không tìm thấy, nên trả về -1)

endswith là lựa chọn hàng đầu cho đuôi file

Một thứ như filename.endswith(".png") cho bạn cách nhanh để kiểm tra xem file có phải là ảnh hay không. Nó phân biệt hoa/thường, nên nếu hoa/thường có thể lẫn lộn, hãy dùng filename.lower().endswith(".png") cho an toàn.

Hãy xây dựng kiểm tra nhanh cho các dòng trông giống lỗi trong log.

log = "ERROR: disk full at /tmp/log" đã được định nghĩa sẵn.

① Dùng startswith để kiểm tra xem log có bắt đầu bằng "ERROR" không, và in kết quả.

② Dùng find để lấy vị trí nơi từ "disk" bắt đầu bên trong log, và cũng in ra.

Python Editor

Chạy code để xem đầu ra

Kiểm tra loại ký tự — isdigit / isalpha / islower / isupper

Họ phương thức is...() trả về True / False dựa trên việc toàn bộ chuỗi có thỏa mãn điều kiện hay không. Lưu ý rằng chỉ cần một khoảng trắng hoặc ký hiệu lẫn vào là đủ để chúng trả về False.

Phương thứcTrả về True khi
isdigit()mọi ký tự đều là chữ số (0–9)
isalpha()mọi ký tự đều là chữ cái, kể cả ký tự CJK (False nếu có khoảng trắng, chữ số hoặc ký hiệu lẫn vào)
isupper()mọi chữ cái đều là chữ hoa
islower()mọi chữ cái đều là chữ thường
print("123".isdigit())       # True
print("12a".isdigit())       # False (có 'a' lẫn vào)

print("Tokyo".isalpha())     # True
print("Tokyo 2024".isalpha())# False (chứa khoảng trắng và chữ số)

print("HELLO".isupper())     # True
print("Hello".islower())     # False

Đừng dùng isdigit để kiểm tra "liệu cái này có thể là số không"

isdigit() chỉ trả về True cho chuỗi trông giống số nguyên không âm. "-12""3.14" đều trả về False. Khi bạn cần xử lý chuỗi có dấu trừ hoặc dấu chấm thập phân như số, hãy bỏ qua isdigit() mà thay vào đó truyền chuỗi cho int() / float() và dùng xử lý ngoại lệ để kiểm tra xem có thành công không.

Hãy kiểm tra xem một chuỗi từ người dùng có ở dạng số dùng được không (một số nguyên không âm).

value = "42" đã được định nghĩa sẵn.

① Dùng isdigit() để kiểm tra xem value có chỉ gồm các chữ số hay không, và print() kết quả.

② Nếu kết quả là True, chuyển value thành số bằng int() và in kết quả của việc cộng thêm 10. Gợi ý: isdigit() có thể được dùng trực tiếp làm điều kiện trong câu lệnh if.

Python Editor

Chạy code để xem đầu ra

Trong bài này bạn đã học về ba loại dấu nháy, cách trích xuất ký tự bằng index và slice, và một bộ phương thức biến đổi và kiểm tra.

Chuỗi là một trong những kiểu phổ biến nhất bạn sẽ dùng trong chương trình. Các phương thức ở đây có thể tái sử dụng trực tiếp khi bạn bắt đầu xử lý input của người dùng trong các bài sau, nên hãy dành chút thời gian chạy các ví dụ để làm quen với chúng.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Khi word = "python", word[-2] là gì?

Câu 2Khi s = "abcdefg", s[1:4] là gì?

Câu 3Kết quả của " Hello World ".strip().lower() là gì?