Kiểu chuỗi (string) trong Python
Chuỗi (string) là một kiểu dữ liệu phổ biến của các ngôn ngữ lập trình. Hướng dẫn này sẽ giới thiệu chi tiết về kiểu chuỗi ký tự (string) trong lập trình Python.
Chuỗi (string) là kiểu dữ liệu phổ biến hàng đầu trong Python. Hầu như bất kỳ chương trình nào cũng đều cần dùng đến kiểu string. Bài học này sẽ giới thiệu chi tiết về kiểu chuỗi ký tự (string) trong Python. String trong Python có nhiều điểm tương đồng với chuỗi trong các ngôn ngữ tựa C hay C#.
String trong Python
Kiểu string trong Python là chuỗi các ký tự Unicode. Python cho phép viết giá trị chuỗi theo nhiều cách khác nhau:
Giá trị string | Ghi chú |
---|---|
‘Hello world’ | Sử dụng cặp dấu nháy đơn |
“Hello world” | Sử dụng cặp dấu nháy kép |
”’Hello world”’ | Sử dụng cặp ”’ (3 dấu nháy đơn) |
“””Hello world””” | Sử dụng cặp “”” (3 dấu nháy kép) |
‘I want to say “I love you”‘ | Có thể dùng dấu nháy kép trong chuỗi nằm trong cặp dấu nháy đơn |
“My name’s Donald” | Có thể dùng dấu nháy đơn trong chuỗi nằm trong cặp dấu nháy kép |
‘My name\’s Donald’ | Dùng \’ để biểu diễn dấu ‘ trong chuỗi nằm giữa cặp nháy đơn |
“I want to say \”I love you\”” | Dùng \” để biểu diễn dấu ” trong chuỗi nằm giữa cặp nháy kép |
Ghi chú: Python không có kiểu ký tự như các ngôn ngữ khác. Kiểu ký tự trong Python có thể xem như một chuỗi chỉ chứa 1 ký tự.
Cuỗi ký tự đặt trong cặp dấu nháy đơn có thể chứa dấu nháy kép. Tương tự, nếu chuỗi ký tự đặt trong cặp dấu nháy kép thì có thể chứa cả dấu nháy đơn. Chuỗi ký tự tạo ra bởi cặp dấu nháy đơn hoặc nháy kép bắt buộc phải nằm trên một dòng.
\’
và \”
được gọi là các escape character biểu diễn cho ký tự ‘ và “.
Cặp 3 dấu nháy đơn (hoặc cặp 3 dấu nháy kép) cho phép tạo ra chuỗi với nhiều dòng. Ví dụ:
Ví dụ
>>>text = """Strings are amongst the most popular types in Python.
We can create them simply by enclosing characters in quotes.
Python treats single quotes the same as double quotes.
Creating strings is as simple as assigning a value to a variable."""
>>>print(text)
>>>line = "Hello world"
>>>print(line)
Tương tự như Các kiểu dữ liệu số trong Python, string cũng là kiểu dữ liệu bất biến (immutable). Nghĩa là mọi thao tác cập nhật chuỗi đều dẫn đến tạo chuỗi mới. Điều này cũng tương tự như kiểu string trong C#.
Escape character trong Python string
Nếu bạn đã học C hẳn đã gặp các ký tự như \r
, \n
, \t
. Các ký tự này được gọi là escape character.
Chuỗi trong Python cũng sử dụng các escape character tương tự như trong C.
Escape character là một số ký tự có ý nghĩa đặc biệt nếu xuất hiện trong xâu. Mỗi escape character là một ký tự. Mỗi ký tự này có thể được biểu diễn ở dạng dấu xược quen thuộc (backslash notation) hoặc ở dạng mã hex.
Dưới đây là một số escape character thường gặp:
Escape character | Mã | Tên gọi |
---|---|---|
\a | 0x07 | Bell/Alert |
\b | 0x08 | Backspace |
\e | 0x1b | Escape |
\f | 0x0c | Formfeed |
\n | 0x0a | Newline |
\r | 0x0d | Carriage return |
\s | 0x20 | Space |
\t | 0x09 | Tab |
\v | 0x0b | Vertical tab |
Đây chỉ là các ký tự thông dụng. Ngoài ra còn một số ký tự nữa ít gặp hơn.
Trong các ký tự trên và \r
, \n
, \t
là thường gặp nhất khi in dữ liệu ra console:
\r
– đưa con trỏ văn bản console về đầu dòng\t
– chèn dấu tab\n
– bắt đầu một dòng mới.
Ví dụ
>>> print("Hello\tworld")
Hello world
>>> print("Hello\nworld")
Hello
world
>>>
Trong cách viết chuỗi, \’
và \”
cũng là các escape character biểu diễn cho ký tự ‘ và “.
Nếu bạn muốn Python bỏ qua tất cả các escape character, bạn có thể viết như sau:
Ví dụ
>>> print(r'Hello\nworld') # đặt thêm r vào trước giá trị chuỗi
Hello\nworld
Bạn đặt thêm r (hoặc R) vào trước giá trị của chuỗi. Ký tự r (R) khi này sẽ biến chuỗi thành chuỗi thô (raw string). Trong chuỗi thô mọi ký tự đặc biệt như escape character sẽ bị bỏ qua.
Ghi chú: Nếu bạn có xuất phát điểm là C#: trong C# bạn không thể viết chuỗi path = "C:\Windows\System32"
do \W và \S không phải là những escape character. C# yêu cầu phải viết \\ để biểu diễn cho \ hoặc đặt @ vào đầu chuỗi. Trong Python tình huống khơi khác một chút. Hãy tự thử nghiệm với lệnh print("C:\\Windows\System32\Drivers")
để nắm rõ hơn.
Các phép toán trên kiểu string trong Python
Python cung cấp sẵn một số phép toán trên chuỗi ký tự.
Để dễ minh họa các phép toán này, chúng ta giả sử có hai chuỗi a = ‘Hello’ và b = ‘Python’.
Phép toán | Ý nghĩa | Ví dụ |
---|---|---|
+ | Phép ghép xâu (concatenation) | a + b cho ‘HelloPython’ |
* | Phép lặp xâu (repetition) | a*2 cho ‘HelloHello’ |
[i] | Phép cắt (slice), lấy ký tự ở vị trí i | a[0] cho ký tự ‘H’ |
[i1:i2] | Phép cắt đoạn (range slice) từ vị trí i1 đến i2; có thể bỏ qua i1 hoặc i2; i1 và i2 âm thì tính từ cuối chuỗi | a[1:4] cho ‘ell’, a[1:] cho ‘ello’ (lấy từ ký tự số 1 về cuối), a[-1:] cho ‘o’ (lấy từ ký tự thứ 1 từ cuối đến hết ký tự cuối cùng), a[1:-1] cho ‘ell’ (lấy từ ký tự số 1 đến ký tự gần cuối) |
in | Kiểm tra thành viên | 'lo' in a cho kết quả True (‘Hello’ chứa ‘lo’), 'lol' in a cho kết quả False (‘Hello’ không chứa ‘lol’), |
not in | Kiểm tra thành viên (phủ định) | Giống như trên nhưng kết quả ngược lại |
r/R | Chuỗi thô | Bạn đã gặp ở phần trên |
% | Định dạng chuỗi | Xem phần tiếp theo |
== | So sánh xâu (bằng) | a == b cho kết quả False |
!= | So sánh xâu (khác) | a != b cho kết quả True |
Lưu ý các phép so sánh chuỗi sẽ so từng cặp ký tự từ trái qua phải, ký tự hoa khác ký tự thường. Python cũng áp dụng các phép so sánh >, <, >=, <= cho kiểu chuỗi ký tự.
Bạn có thể thử nghiệm các phép toán trên như sau:
Ví dụ
>>> a, b = 'Hello', 'Python'
>>> a + b
'HelloPython'
>>> a[1:]
'ello'
>>> a[-1:]
'o'
>>> a[-1:0]
''
>>> a[-2:]
'lo'
>>> 'lo' in a
True
>>> 'lol' in a
False
>>> a * 2
'HelloHello'
>>> a[0]
'H'
>>>
Chuỗi định dạng (formated string) trong Python
Ví dụ
>>> name, age = 'Donald', 40
>>> greeting = 'Welcome, %s, %i years old' % (name, age)
>>> greeting
'Welcome, Donald, 40 years old'
>>> print('Welcome to heaven, %s, %i years old' % (name, age))
Welcome to heaven, Donald, 40 years old
>>>
Ví dụ này minh họa cách tạo một xâu có định dạng từ một khuôn mẫu và các biến.
Lưu ý các biến phải đặt trong cặp dấu () và phân tách nhau bởi dấu phẩy. Danh sách biến (thực chất là một biến kiểu tuple) phân tách với chuỗi bằng ký tự <strong>%</strong>
– phép toán định dạng chuỗi của Python. Thứ tự biến trong tuple phải giống với thứ tự nó xuất hiện trong chuỗi. Trong ví dụ trên, nếu thay đổi thứ tự name và age sẽ gây lỗi.
Dưới đây là các ký tự định dạng trong Python:
Ký tự định dạng | Ý nghĩa |
---|---|
%c | ký tự |
%s | chuỗi |
%i | số nguyên (có dấu) |
%d | số nguyên (có dấu) |
%u | số nguyên (không dấu) |
%o | số nguyên (cơ số 8) |
%x, %X | số nguyên (cơ số 16) |
%e, %E | biểu diễn khoa học |
%f | số thực |
Đây là cách thức tạo chuỗi có định dạng từ Python 2.x. Trong Python 3 bạn vẫn có thể dùng được lối viết này.
Nếu không muốn dùng phép toán định dạng %, bạn có thể sử dụng hàm format
như sau:
Ví dụ
>>> print('Welcome to heaven, {1}, {0} years old'.format(age, name))
Welcome to heaven, Donald, 40 years old
Khi sử dụng hàm format bạn tạo ra các placeholder trong chuỗi với số thứ tự (tính từ 0). Biến với số thứ tự tương ứng từ phương thức format sẽ được đặt vào thay cho placeholder để tạo thành chuỗi hoàn chỉnh.
Ghi chú: Lối viết này hoàn toàn giống chuỗi định dạng trong C#.
Cách viết này tiện lợi hơn so với sử dụng phép toán định dạng %. Bạn không cần nhớ các ký tự định dạng nữa.
Từ Python 3.6 bạn có thể sử dụng một lối viết chuỗi định dạng khác:
Ví dụ
>>> name, age = 'Donald', 40
>>> print(f'Hello, {name}. You are {age}. Welcome to heaven!')
Hello, Donald. You are 40. Welcome to heaven!
Đây là lối viết chuỗi định dạng tiện lợi nhất trong Python.
Trong lối viết này bạn đặt ký tự f vào đầu chuỗi. Bên trong chuỗi bạn có thể sử dụng biến đặt trong cặp {}. Loại chuỗi này được gọi là f-string. Bên trong cặp {} bạn có thể sử dụng bất kỳ giá trị hoặc biểu thức nào của Python.
Ghi chú: Cách viết này rất giống với string interpolation trong C#.
Các phương thức xử lý chuỗi trong Python
Chuỗi trong Python là một object với nhiều phương thức xây dựng sẵn. Dưới đây là minh họa một số phương thức thường gặp.
Ví dụ
>>> greeting = 'Hello, Donald. Welcome to heaven'
>>> greeting
'Hello, Donald. Welcome to heaven'
>>> # các hàm sau đây phải sử dụng từ object của chuỗi
>>> greeting.capitalize() # viết hoa chữ cái đầu tiên, tất cả chữ cái còn lại viết thường
'Hello, donald. welcome to heaven'
>>> greeting.lower() # chuyển về chuỗi viết thường
'hello, donald. welcome to heaven'
>>> greeting.upper() # chuyển về chuỗi viết hoa
'HELLO, DONALD. WELCOME TO HEAVEN'
>>> greeting.title() # viết hoa chữ cái đầu mỗi từ
'Hello, Donald. Welcome To Heaven'
>>> greeting.split() # cắt một chuỗi ra các từ
['Hello,', 'Donald.', 'Welcome', 'to', 'heaven']
>>> greeting = ' Hello, Donald. Welcome to heaven '
>>> greeting.strip() # cắt các khoảng trống ở đầu và cuối chuỗi
'Hello, Donald. Welcome to heaven'
>>> greeting.rstrip() # cắt các khoảng trống ở cuối chuỗi (lề phải)
' Hello, Donald. Welcome to heaven'
>>> greeting.lstrip() # cắt các khoảng trống ở đầu chuỗi (lề trái)
'Hello, Donald. Welcome to heaven '
>>> # một số hàm kiểm tra
>>> my_string = "Hello World"
>>> my_string.isalnum() #kiểm tra xem chuỗi có chứa toàn chữ số
False
>>> my_string.isalpha() # chuỗi chứa toàn chữ cái
False
>>> my_string.isdigit() # chuỗi có chứa chứ số
False
>>> my_string.isupper() # chuỗi chứa toàn ký tự hoa
False
>>> my_string.islower() # chuỗi chứa toàn kỹ tự thường
False
>>> my_string.isspace() # chuỗi chỉ chứa khoảng tráng
False
>>> my_string.endswith('d') # kết thúc là d
True
>>> my_string.startswith('H') # bắt đầu là H
True
>>># hàm sau đây là hàm toàn cục
>>> len(greeting) # lấy độ dài chuỗi
32
>>>
Ghi chú: Do string trong Python là một class với nhiều phương thức hỗ trợ, bạn cần gọi các phương thức này từ biến (ví dụ greeting.upper()). Đây là điểm khác biệt so với các hàm toàn cục như print hay input (không gọi từ biến).
Chúng ta sẽ học chi tiết về class trong Python ở phần sau của bài giảng.
Kết luận
Bài học này đã giới thiệu chi tiết về kiểu chuỗi ký tự (string) trong Python. Điểm lưu ý là trong Python có nhiều cách khác nhau để viết giá trị kiểu string (so với các ngôn ngữ như C# hay Java). Tuy nhiên, string trong Python có nhiều điểm tương đồng với chuỗi trong các ngôn ngữ tựa C như escape sequence và cách viết định dạng (kiểu cũ). Python 3 có cách định dạng rất giống với C#.