Kiểu chuỗi ký tự (string) trong Python

    1

    Chuỗi ký tự (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ị stringGhi 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

    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ụ:

    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 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 characterTên gọi
    \a0x07Bell/Alert
    \b0x08Backspace
    \e0x1bEscape
    \f0x0cFormfeed
    \n0x0aNewline
    \r0x0dCarriage return
    \s0x20Space
    \t0x09Tab
    \v0x0bVertical 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, \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.
    >>> 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:

    >>> 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.

    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ĩaVí 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í ia[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ỗia[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)
    inKiể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 inKiểm tra thành viên (phủ định)Giống như trên nhưng kết quả ngược lại
    r/RChuỗi thôBạn đã gặp ở phần trên
    %Định dạng chuỗiXem 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:

    >>> 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

    Hãy xem ví dụ sau:

    >>> 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ự % – 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
    %cký tự
    %schuỗi
    %isố nguyên (có dấu)
    %dsố nguyên (có dấu)
    %usố nguyên (không dấu)
    %osố nguyên (cơ số 8)
    %x, %Xsố nguyên (cơ số 16)
    %e, %Ebiểu diễn khoa học
    %fsố 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:

    >>> 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.

    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:

    >>> 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.

    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.

    >>> 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
    
    >>>

    Lưu ý: 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#.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Subscribe
    Notify of
    guest
    1 Thảo luận
    Oldest
    Newest
    Inline Feedbacks
    View all comments
    Quan

    Cho em hỏi về sự khác biệt của %i và %d trong ký tự định dạng với ạ, tại em thấy trên bảng ghi ý nghĩa giống nhau. Em cảm ơn