Cuộc đời xoay quanh những dòng chữ
Ngày mới học lập trình, tôi thường lười và ngại xử lý các string ("chuỗi") - tức các dòng chữ, đoạn văn. Tôi thích mang lập trình ra để tính toán, tìm số nguyên tố, tìm bội nhỏ nhất, ước lớn nhất, đường đi loằng ngoằng nhất... Vậy nhưng đến khi đi làm, mới nhận ra, 68,59 % số code viết ra đều chỉ để xử lý string. Bởi thế mới nói, xử lý string quan trọng như nước trong cơ thể vậy 😳.
- Có bao nhiêu người lập trình để tính toán khoa học?
Không nhiều lắm
Có bao nhiêu người xử lý đồ hoạ (tức viết ra phần mềm Photoshop, Camera360 chứ KHÔNG PHẢI dùng phần mềm Photoshop), thực hiện các phép toán trên bit và bytes?
- Không nhiều lắm
Và còn lại, bao nhiêu người làm website, xử lý các HTTP request? lưu và xử lý thông tin người dùng, vốn là dạng text? Số này là rất rất nhiều.
Python hỗ trợ text, hỗ trợ đến tận răng, mà cần gì thì chỉ việc mang ra dùng, không cần nghĩ suy. Không tin thì làm thử coi.
Kiểu dữ liệu này trên Python gọi là string.
Tạo string
đặt cho chúng là s
và ss
:
>>> s = "Python"
>>> type(s)
<class 'str'>
>>> s2 = ""
>>> type(s2)
<class 'str'>
>>> s3 = "a"
>>> type(s3)
<class 'str'>
>>> ss = "Trái đất này là của chúng mình."
>>> print(s)
Python
>>> print(ss)
Trái đất này là của chúng mình.
Dùng function (hàm) print
để in object ra màn hình - chưa cần hiểu function là gì
nhưng cứ dùng đã. Cú pháp là function
rồi dấu mở ngoặc (
, đến một hay nhiều
object phân cách nhau bằng đấu ,
rồi đến dấu đóng ngoặc )
.
Chú ý: Python 3 dùng cú pháp print(s)
, Python 2 dùng cú pháp python s
, toàn bộ
loạt bài viết này dùng Python 3.
Độ dài của string
Độ dài của s
là bao nhiêu đếm 3 giây là biết: 6
ký tự.
Độ dài của ss
là bao nhiêu thì đếm 30 giây mới biết được 🙄
Máy móc sinh ra là để phục vụ con người, để tự động hoá những công việc nhàm chán,
và việc đếm thì chỉ các cháu lớp một mới thấy vui. Ta dùng function len
để đếm
độ dài của 1 string, kết quả của các phép đếm này là các object integer:
>>> len(s)
6
>>> len(ss)
31
>>> len(s2)
0
String có độ dài bằng không còn có tên gọi "empty string".
Nối string
Các string được nối với nhau bằng phép cộng:
>>> s + " thật là " + "thon" + "."
'Python thật là thon.'
Nhưng string không cộng được với số, muốn cộng số phải biến đổi số đó
về kiểu string với function str
:
>>> s + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> s + str(3)
'Python3'
Phép cộng một string với một số integer gặp exception TypeError,
với nội dung exception "không thể chuyển đổi object kiểu int
thành khiểu str
một cách không chủ động (implicitly)"
Nhân bản
Phép nhân vốn là nhiều lần của phép cộng. Nhân string cũng vậy,
ta dễ dàng tạo 42 dấu *
bằng phép nhân:
>>> "*" * 42
'******************************************'
>>> 42 * "*"
'******************************************'
Hay nếu một ngày bị gấu mắng và bắt xin lỗi 30 lần? Đừng lo, đã có Python đứng về phía bạn:
>>> "Xin lỗi em " * 30
'Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em Xin lỗi em '
Kiểm tra một string có trong một string khác
Chữ P
có trong string s
không? dò một cái là thấy có.
nh
có trong string ss
không? tìm mãi mới ra. Lại một công việc
nhàm chán khác mà lập trình sẽ giúp ta giải quyết. Kết quả
phép kiểm tra này (có tên tiếng anh là "test membership") là một giá trị
Boolean, True
nếu tìm thấy, False
nếu không:
>>> "nh" in ss
True
>>> "hkt" in ss
False
Để kiểm tra xem có KHÔNG thấy một string trong string khác không,
ta thêm not
trước in
:
>>> "p" not in "Python"
True
>>> "P" in "Python"
True
Ta thấy Python phân biệt chữ hoa, chữ thường (case sensitive).
Gọi method
Cú pháp string.mt(gì đó)
gọi là "gọi method mt".
Kiểm tra string bắt đầu với một tiền tố
Giống như kiểm tra xem có một string có chứa string khác không, Python có thể kiểm tra một string có bắt đầu với một string khác không:
>>> "Python is an animal".startswith("Python ") # chú ý chữ ``s`` sau ``start``
True
String "Python "
là "tiền tố" (prefix) của string "Python is an animal"
.
Kiểm tra string có kết thúc với một hậu tố
Rắt tiện lợi để kiểm tra đơn giản xem một file có phải là file ảnh định dạng PNG
hay không dựa vào tên của file đó. Nếu nó kết thúc với hậu tố (suffix) phần
mở rộng là ".png"
, nó là (có vẻ) một file ảnh:
>>> "filebimat.png".endswith(".png")
True
Dùng từ "có vẻ" bởi người ta hoàn toàn có thể đặt cho file ảnh một phần mở rộng
khác, .txt
chẳng hạn - với một mục đích không trong sáng nào đó 😊
Biến đổi về chữ hoa
>>> sup = ss.upper()
>>> print(sup)
TRÁI ĐẤT NÀY LÀ CỦA CHÚNG MÌNH.
Biến đổi về chữ thường
>>> sl = sup.lower()
>>> print(sl)
trái đất này là của chúng mình.
Biến đổi để mỗi từ trong string đều là chữ hoa
>>> sl.title()
'Trái Đất Này Là Của Chúng Mình.'
Biến đổi để chữ cái đầu tiên là chữ hoa
>>> sl.capitalize()
'Trái đất này là của chúng mình.'
Bỏ các ký tự khoảng trắng
Ký tự khoảng trắng - whitespace
Là các ký tự ... mà nhìn vào chỉ thấy trắng. Nó bao gồm ký tự dấu cách (space), tab, xuống dòng (newline).
>>> swhite = " Còn tuổi nào cho em "
>>> swhite.strip()
'Còn tuổi nào cho em'
Nếu chỉ muốn bỏ khoảng trắng bên phải, dùng rstrip
(right strip), nếu chỉ muốn bỏ khoảng
trắng bên trái, dùng lstrip
(left strip).
>>> swhite.lstrip()
'Còn tuổi nào cho em '
Cắt string/nối list các string
>>> ws = "con chim non trên cành\tcao".split()
>>> ws
['con', 'chim', 'non', 'trên', 'cành', 'cao']
>>> # cắt tại các ký tự khoảng trắng và bỏ các empty string đi - kết quả khác với dòng tiếp ws1
>>> ws1 = "con chim non trên cành\tcao".split(" ")
>>> ws1
['con', 'chim', 'non', '', '', '', '', 'trên', 'cành\tcao']
>>> ws2 = "con.chim.non".split(".")
>>> ws2
['con', 'chim', 'non']
>>> " ".join(ws2)
'con chim non'
Kiểm tra 2 string có bằng nhau không:
Dùng hai dấu bằng (==
).
>>> swhite.strip() == swhite.lstrip()
False
>>> "Python" == "python".capitalize()
True
Xem đầy đủ các string method khác tại: