Câu 1Khi word = "python", word[-2] là gì?
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.
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
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
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.
[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)
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ề.
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.
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ỏ)
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ảnxuấ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ảnkhông (True / False) - endswith("văn bản") — trả về chuỗi có kết thúc bằng
văn bảnkhô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.
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ức | Trả 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" và "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.
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.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Khi s = "abcdefg", s[1:4] là gì?
Câu 3Kết quả của " Hello World ".strip().lower() là gì?