Chuỗi (str) là dãy ký tự: tên nhân vật, câu thoại, dòng thông báo trên màn hình. Python có sẵn rất nhiều cách xử lý chuỗi. Bài này đi qua những cách dùng hằng ngày.
Tạo chuỗi
Dùng nháy đơn hoặc nháy kép. Chuỗi nhiều dòng dùng ba dấu nháy:
hero = "Aki"
enemy = 'Goblin'
intro = """Ngày xửa ngày xưa,
có một con rồng giữ kho báu."""
print(intro)
# Ngày xửa ngày xưa,
# có một con rồng giữ kho báu.
f-string
Người mới hay ghép chuỗi bằng dấu + và phải str() từng số, vừa dài vừa dễ quên dấu cách:
gold = 250
print("Bạn có " + str(gold) + " vàng") # Bạn có 250 vàng
Cách gọn là f-string: thêm chữ f trước dấu nháy, đặt biến trong {}.
hero = "Aki"
gold = 250
print(f"{hero} có {gold} vàng") # Aki có 250 vàng
Trong {} viết được cả biểu thức:
hp = 45
max_hp = 120
print(f"Máu: {hp}/{max_hp} ({hp / max_hp * 100:.1f}%)") # Máu: 45/120 (37.5%)
:.1f là định dạng: số thực, 1 chữ số thập phân. Một định dạng khác hay dùng là :, để thêm dấu phẩy ngăn hàng nghìn:
score = 1250000
print(f"Điểm: {score:,}") # Điểm: 1,250,000
Lỗi hay gặp: quên chữ
f.print("{hero} có {gold} vàng")in ra nguyên văn{hero} có {gold} vàng, không báo lỗi gì. Thấy dấu ngoặc nhọn hiện lên màn hình thì kiểm tra chữfđầu tiên.
Độ dài với len
player_name = "DragonSlayer"
print(len(player_name)) # 12
if len(player_name) > 10:
print("Tên quá dài, tối đa 10 ký tự")
Đổi hoa thường và bỏ khoảng trắng
Các method (hàm gắn với một giá trị, gọi bằng dấu chấm) của chuỗi luôn trả về chuỗi mới. Chuỗi gốc không đổi.
name = " aki "
print(f"[{name.upper()}]") # [ AKI ]
print(f"[{name.strip()}]") # [aki]
print(f"[{name.strip().title()}]") # [Aki]
print(f"[{name}]") # [ aki ], vẫn như cũ
Dấu [ ] trong ví dụ chỉ để bạn nhìn thấy khoảng trắng hai đầu.
Muốn giữ kết quả thì gán lại: name = name.strip().
So sánh lệnh người chơi gõ mà không phân biệt hoa thường:
command = "ATTACK"
if command.lower() == "attack":
print("Tấn công!") # Tấn công!
Hai method tìm kiếm hay dùng:
line = "Boss rơi ra Kiếm lửa"
print("Kiếm" in line) # True
print(line.replace("Kiếm", "Cung")) # Boss rơi ra Cung lửa
Tách và nối với split, join
split() cắt chuỗi thành một list. Không truyền gì thì cắt theo khoảng trắng.
command = "use potion 3"
parts = command.split()
print(parts) # ['use', 'potion', '3']
Truyền ký tự ngăn cách để đọc dữ liệu kiểu CSV:
save_line = "Aki,12,3400"
name, level, gold = save_line.split(",")
print(name, level, gold) # Aki 12 3400
Lưu ý level và gold lúc này vẫn là chuỗi. Cần ép kiểu bằng int() trước khi tính toán.
join() làm ngược lại: nối các chuỗi trong list bằng một chuỗi ngăn cách. Cú pháp hơi ngược: chuỗi ngăn cách đứng trước.
items = ["Kiếm", "Khiên", "Bình máu"]
print(", ".join(items)) # Kiếm, Khiên, Bình máu
Lấy ký tự và cắt chuỗi
Mỗi ký tự có một chỉ số, đếm từ 0. Chỉ số âm đếm từ cuối lên.
title = "DRAGONSLAYER"
print(title[0]) # D
print(title[-1]) # R
Slicing [bắt_đầu:kết_thúc] lấy một đoạn, không lấy ký tự ở vị trí kết thúc:
title = "DRAGONSLAYER"
print(title[0:6]) # DRAGON
print(title[6:]) # SLAYER
print(title[:3]) # DRA
print(title[-5:]) # LAYER
print(title[::-1]) # REYALSNOGARD
Bỏ trống đầu thì hiểu là từ đầu chuỗi, bỏ trống cuối thì tới hết. [::-1] đảo ngược chuỗi.
Chuỗi không sửa từng ký tự được. title[0] = "d" báo TypeError: 'str' object does not support item assignment. Muốn đổi thì tạo chuỗi mới: title = "d" + title[1:].
Bài tập
Người chơi gõ lệnh " BUY sword 2 ". Hãy bỏ khoảng trắng hai đầu, đổi về chữ thường, tách thành ba phần, rồi in "Mua 2 x sword" bằng f-string.
Xem đáp án
raw = " BUY sword 2 "
action, item, amount = raw.strip().lower().split()
amount = int(amount)
print(action) # buy
print(f"Mua {amount} x {item}") # Mua 2 x sword