Chuỗi là kiểu dữ liệu được tạo nên từ danh sách các kí tự (character), nó có thể là một từ, một câu hoặc kể cả một đoạn văn. Để biểu diễn một chuỗi, chúng ta sẽ bao quanh chúng bằng cặp ngoặc kép (") hoặc cặp ngoặc đơn (') đều được.
Ví dụ như với câu lệnh print cơ bản nhất mà chúng ta biết, thì giá trị truyền vào có thể là một chuỗi:
print("Hello world")
Ở câu lệnh trên, chuỗi là "Hello world". Hơn nữa, các bạn cần phải lưu ý tránh nhầm lẫn giữa biến và chuỗi. Biến sẽ không được bao quanh bởi các cặp ngoặc.
a = 5 # Gán biến a là 5
print(a) # In ra biến a
print("a") # In ra chuỗi "a"
Giống như các kiểu dữ liệu khác, chuỗi cũng có thể gán cho một biến bằng cú pháp thông thường:
Cú pháp:
<bien> = <gia_tri>
Ví dụ như nếu bạn muốn gán "I am Phuc" vào biến chuoi_1 và in ra, thì bạn có thể làm như sau.
chuoi_1 = "I am Phuc"
Như đã lưu ý ở bài về nhập, xuất dữ liệu. lệnh input() bình thường sẽ nhập vào một chuỗi (xâu ký tự), nên các em chỉ cần viết bình thường mà không cần làm gì thêm.
Ví dụ. Nhập vào họ tên bạn và xuất ra màn hình dòng chữ: "Xin chào {tên bạn}"
name = input("Hay nhap ten ban:")
print("Xin chao ", name)
Như đã được trình bày ở đầu bài, chuỗi có thể được xem là một danh sách các kí tự. Do đó, bạn có thể truy cập vào một kí tự của chuỗi như cách ta truy cập vào một phần tử trong danh sách:
Cú pháp:
<bien>[<vi_tri>]
Bạn cũng cần lưu ý rằng vị trí ở đây sẽ được tính từ 0 như cách mà danh sách hoạt động. Ví dụ như bạn muốn truy cập vào kí tự "h" trong chuỗi "Phuc" và in ra, bạn có thể viết như sau.
S = "Phuc"
print(S[1])
Nhiệm vụ 1. Viết chương trình cho phép người dùng nhập vào một xâu S. Tiếp tục cho người dùng nhập một số nguyên a. Xuất ra màn hình 2 dòng:
Dòng đầu là xâu S
Dòng thứ 2 là ký tự tại vị trí a.
Ví dụ:
input | output
------------------------
Chao ban | o
3
Nhiệm vụ 1. Viết chương trình cho phép người dùng nhập vào một xâu S. Tiếp tục cho người dùng nhập một số nguyên a. Xuất ra màn hình 2 dòng:
Dòng đầu là xâu S
Dòng thứ 2 là ký tự tại vị trí a.
Ví dụ:
input | output
------------------------
Chao ban | Chao ban
3 | o
Thay vì truy cập vào duy nhất một kí tự, bạn có thể lấy một đoạn (lát cắt) của chuỗi bằng cách nhập vào hai vị trí đầu cuối của đoạn cần lấy. Tuy nhiên, cần lưu ý là vị trí sau cần phải tăng lên một đơn vị bởi vì vị trí cuối cùng là vị trí dừng.
Cú pháp:
bien[<vi_tri_dau>:<vi_tri_sau>]
Ví dụ như bạn muốn lấy đoạn "Ph" trong chuỗi "Phuc". Thì bạn sẽ bắt đầu từ vị trí 0, và kết thúc tại vị trí 1.
S = "Phuc"
print(S[0:2])
Nhiệm vụ 2. Viết chương trình cho phép người dùng nhập vào một xâu S. Tiếp tục cho người dùng nhập hai số nguyên a, b. Xuất ra màn hình 2 dòng:
Dòng đầu là xâu S
Dòng thứ 2 là dãy ký tự từ a đến
Ví dụ:
input | output
------------------------
Chao ban | Chao ban
2 5 | ao b
Một điểm lưu ý quan trọng về sự khác biệt của chuỗi so với danh sách, đó là chuỗi không thay đổi được (immutable), nhưng danh sách thì có thể thay đổi (mutable).
Ví dụ như nếu bạn có danh sách thì bạn có thể thay đổi phần tử của chúng như sau:
a = [0, 1, 2]
a[1] = 3
print(a) # [0, 3, 2]
Tuy nhiên, đối với chuỗi, bạn sẽ bị báo lỗi như sau.
'str' object does not support item assignment
Nếu như bạn muốn thay đổi kí tự trong chuỗi, thì bạn có thể tạo chuỗi mới từ chuỗi ban đầu.
a = "012"
b = a[0] + "3" + a[2]
print(b) # 032
Để thuận tiện cho việc xử lý chuỗi, chúng ta có thể tách một chuỗi thành nhiều phần. Ví dụ như khi người dùng nhập vào một chuỗi gồm họ và tên, bạn có thể tách chuỗi tại cách dấu cách (space) để từ đó trích xuất được tên của người dùng.
Cú pháp:
<bien>.split(<ki_tu_ngan_cach>)
Với cú pháp trên, bạn sẽ tách <bien> thành nhiều chuỗi con tại các kí tự ngăn cách được truyền vào. Kết quả trả về sẽ là một danh sách các chuỗi. Lưu ý rằng <ki_tu_ngan_cach> cũng phải là một chuỗi.
Để hình dung rõ hơn, dưới đây là ví dụ ta rút trích tên của người dùng từ họ và tên. Đầu tiên, ta sẽ tách họ và tên tại dấu cách, lưu kết quả vào biến tach_chuoi. Sau đó, để lấy phần tử cuối cùng trong danh sách, ta sử dụng vị trí -1 (cuối danh sách).
S = "Nguyen Van Hung"
T = S.split()
print(T)
Nhiệm vụ 3. Viết chương trình cho phép người dùng nhập vào họ tên của một người. Xuất ra 3 dòng
Dòng đầu là họ tên đầy đủ
Dòng thứ 2 là họ của người đó
Dòng thứ 3 là tên của người đó
Ví dụ:
input | output
------------------------
Ly Tu Trong | Ly Tu Trong
| Ly
| Trong
Ngược lại với tách chuỗi, bạn cũng có thể gộp các chuỗi trong danh sách lại với nhau. Ví dụ như khi bạn có tên các ứng viên của một cuộc phỏng vấn, và cần gộp các tên này lại, ngăn cách bởi dấu chấm phẩy (;) thì đây là tình huống bạn có thể sử dụng.
Cú pháp:
<ki_tu_gop>.join(<danh_sach_chuoi>)
Để mô phỏng bài toán trên, ta có thể viết chương trình như sau.
DS = ["Hung", "Nam", "Khanh", "Nguyen", "Dung", "Phuong"]
DSGop = ";".join(DS)
print(DSGop)
Nhiệm vụ 4. Viết chương trình cho phép người dùng nhập vào hai số nguyên a, b. Xuất ra biểu thức dạng như sau:
a + b = tổng của a và b
Ví dụ:
input | output
------------------------
5 6 | 5 + 6 = 11
Nhiệm vụ 5. Viết chương trình cho phép người dùng nhập vào số nguyên N và một dãy N số nguyên number. Xuất ra biểu thức dạng như sau:
num1 + num2+ ...+numn= tổng của N số
Ví dụ:
input | output
------------------------
4 |
4 3 6 7 | 4+3+6+7 = 20
Để lấy được chiều dài của chuỗi, bạn có thể đơn giản sử dụng hàm len (viết tắt của chữ length). Một điểm lưu ý rằng các kí tự đặc biệt như dấu cách (space), cũng sẽ được tính là một kí tự.
Cú pháp:
len(<chuoi>)
Ví dụ như chuỗi "Xin chao" sẽ có chiều dài là 8. Bao gồm "Xin" là 3 kí tự; 1 dấu cách (space) và 4 kí tự "chao".
S = "Xin chao"
print(len(S)) # Kết quả xuất: 8
Có một số bạn sẽ thắc mắc rằng "Nếu mình sử dụng dấu ngoặc kép để khai báo một chuỗi, vậy thì làm sao để biểu diễn dấu ngoặc kép trong chuỗi?". Đối với một số kí tự đặc biệt, bạn có thể sử dụng thêm dấu xẹt "\" (backslash) trước chúng để biểu diễn:
Ví dụ như:
Dấu ngoặc kép \"
Dấu ngoặc đơn \'
Dấu xuống hàng \n (newline)
Bạn có thể tham khảo đoạn chương trình sau.
print("Hello, World!\nWelcome to Python.")
print("Name\tAge\tLocation")
print("This is a backslash: \\")
print('It\'s a great day!')
print("He said, \"Hello!\"")
''' kết quả:
Hello, World!
Welcome to Python.
Name Age Location
This is a backslash: \
It's a great day!
He said, "Hello!"
'''
Nguồn: GeekforGeeks
Ngoài các hàm thông dụng trên, các bạn còn có nhiều hàm hỗ trợ bạn xử lý chuỗi. Ở mục này, mình sẽ đề cập vài hàm bạn có thể sử dụng. Nếu bạn muốn tìm hiểu thêm nữa, thì bạn có thể tham khảo tại đây: W3School-String.
Hàm lowercase sẽ giúp bạn chuyển toàn bộ các kí tự in hoa thành kí tự viết thường.
Cú pháp:
<chuoi>.lower()
S = "Hello"
print(S.lower()) # Kết quả: hello
Nhiệm vụ 6. Viết chương trình cho phép nhập vào họ tên người dùng. Xuất ra họ tên người dùng ở dạng in thường
ví dụ:
input | output
-----------------------
Nguyen Du | nguyen du
Tương tự, chúng ta sẽ có hàm để viết in hoa tất cả các kí tự trong chuỗi lên.
Cú pháp:
<chuoi>.upper()
S = "Hello"
print(S.upper()) # Kết quả: HELLO
Bạn cũng có thể ép kiểu (type-casting) từ một biến có kiểu số thành kiểu chuỗi.
Cú pháp:
str(<bien>)
Ví dụ như là bạn muốn đếm xem một số có bao nhiêu chữ số, thì bạn có thể ép về kiểu chuỗi xong rồi lấy chiều dài của chuỗi đó.
num = 13498368739456
strnum = str(num)
print(len(strnum))
Bài 1. Viết chương trình cho phép nhập vào một chuỗi ký tự S bất kỳ. Sau đó nhập vào một ký tự k bất kỳ, đếm và xuất ra màn hình số lần xuất hiện của k trong S
ví dụ:
input | output
-----------------------
Nguyen Du | 2
u
Bài 2. Viết chương trình cho phép nhập vào một chuỗi ký tự S bất kỳ. Sau đó xuất ra các ký tự của xâu S theo thứ tự ngược lại.
ví dụ:
input | output
-----------------------
Nguyen Du | uD neyugN
Bài 3. Viết chương trình cho phép nhập vào một chuỗi ký tự S bất kỳ, có thể chứa khoảng trắng ở đầu và cuối xâu. Sau đó xuất ra xâu S nhưng đã được loại bỏ hoàn toàn những khoảng trắng thừa ở đầu và cuối.
ví dụ:
input | output
------------------------------
Nguyen Du | Nguyen Du
Bài 4. Viết chương trình cho phép nhập vào một chuỗi ký tự S bất kỳ, đếm và xuất ra số từ của chuỗi. Biết rằng mỗi từ cách nhau đúng một khoảng trắng.
ví dụ:
input | output
-------------------------------
Duong Nguyen Du | 3
Bài 5. Viết chương trình cho phép nhập vào một chuỗi ký tự S bất kỳ, đếm và xuất ra số chữ cái, số chữ số của xâu S.
ví dụ:
input | output
-------------------------------
So 15 Nguyen Du | So chu cai: 10
| So chu so: 2
Bài 6. Viết chương trình cho phép nhập vào một biểu thức số học bất kỳ có chứa hai số hạng và một phép toán, phép toán này là một trong bốn phép toán +, - , * , /. Xuất ra màn hình kết quả của biểu thức.
ví dụ:
input | output
--------------------
5 + 3 | 8
Bài 7. Viết chương trình cho phép nhập vào một xâu S bất kỳ, có thể rất dài. Sau đó nhập vào một xâu T ngắn, hãy tìm và xuất ra vị trí xuất hiện đầu tiên và cuối cùng của T trong S.
ví dụ:
input | output
------------------------------------------------------------------------------------------------------
xâu S: "Chao cac ban. Hôm nay minh se dan cac ban tham quan cac dia diem thu vi." | vi tri dau: 5
xâu T: "cac" | vi tri cuoi: 52
Bài 8. Viết chương trình cho phép nhập vào một xâu S bất kỳ. Sau đó nhập vào một xâu T. Đếm số lần xuất hiện của T trong S bất kể in hoa hay in thường.
ví dụ:
input | output
------------------------------------------------------------------------------------------------------
xâu S: "Chao cac ban. Hôm nay minh se dan cac ban tham quan Cac dia diem thu vi." | So chu cac: 3
xâu T: "cac" |
Bài 9. Viết chương trình cho phép nhập vào một xâu S bất kỳ. Kiểm tra xem xâu S có đối xứng hay không. Biết rằng xâu đối xứng là xâu mà đọc từ trái sang phải hay từ phải sang trái là như nhau.
ví dụ:
input | output
--------------------------
xâu S: "madam" | YES
Bài 10. Viết chương trình cho phép nhập vào hai xâu S1 và S2, kiểm tra xem hai xâu này có cân bằng hay không. Hai xâu được gọi là cân bằng nếu mọi ký tự trong xâu này đều có trong xâu kia và ngược lại, vị trí xuất hiện các ký tự và việc in hoa hay thường là không quan trọng.
ví dụ:
input | output
-------------------------------
xâu S1: "Chao ban" | YES
xâu S2: "Bao chan"