[ATBS2nd]Chương 1 - Python cơ bản - Phần 22

Chào các bạn,
Chúng ta là tiếp tục với phần thao tác chuỗi trong Python. Phần này chúng ta sẽ tìm hiểu những phương thức hữu ích khi xử lý chuỗi.
Những phương thức hữu ích khi xử lí chuỗi
Một số phương thức phân tích chuỗi hoặc tạo giá trị chuỗi biến đổi. Phần này các phương pháp lặp đi lặp lại được sử dụng thường xuyên nhất.
Phương thức upper(), lower(), isupper(), và islower()
Các phương thức chuỗi upper()lower() trả về một chuỗi mới trong đó tất cả các chữ cái trong chuỗi gốc đã được chuyển đổi thành chữ hoa hoặc chữ thường, tương ứng. Các ký tự không phải là chữ trong chuỗi vẫn không thay đổi. Nhập thông tin sau vào command line:

>>> spam = 'Hello, world!'
>>> spam = spam.upper()
>>> spam
'HELLO, WORLD!'
>>> spam = spam.lower()
>>> spam
'hello, world!'

Lưu ý rằng các phương thức này không tự thay đổi chuỗi mà trả về giá trị chuỗi mới. Nếu bạn muốn thay đổi chuỗi gốc, bạn phải gọi hàm upper() hoặc lower() trên chuỗi và sau đó gán chuỗi mới cho biến nơi lưu trữ bản gốc. Đây là lý do tại sao bạn phải sử dụng spam = spam.upper() để thay đổi chuỗi trong spam thay vì chỉ đơn giản là spam.upper(). (Điều này giống như nếu biến eggs có giá trị 10. Viết eggs + 3 không làm thay đổi giá trị của eggs, nhưng eggs = eggs + 3 thì có.) Các phương pháp upper()lower() rất hữu ích nếu bạn cần làm một so sánh nhạy cảm. Ví dụ: các chuỗi ‘great’‘GREat’ không bằng nhau. Nhưng trong chương trình nhỏ sau đây, việc người dùng gõ Great, GREAT hay grEAT không thành vấn đề, bởi vì chuỗi đầu tiên được chuyển đổi thành chữ thường.

print('How are you?')
feeling = input()
if feeling.lower() == 'great':
	print('I feel great too.')
else:
	print('I hope the rest of your day is good.')

Khi bạn chạy chương trình này, câu hỏi được hiển thị và nhập một biến great, chẳng hạn như GREat, vẫn sẽ cho đầu ra I feel great too. Thêm mã vào chương trình của bạn để xử lý các biến thể hoặc lỗi trong đầu vào của người dùng, chẳng hạn như viết hoa không nhất quán, sẽ giúp chương trình của bạn dễ sử dụng hơn và ít có khả năng lỗi.

How are you?
GREat
I feel great too.

Các phương thức isupper()islower() sẽ trả về giá trị Boolean là True nếu chuỗi có ít nhất một chữ cái và tất cả các chữ cái lần lượt là chữ hoa hoặc chữ thường. Nếu không, phương thức trả về False. Nhập nội dung sau vào command line và chú ý những gì mỗi phương thức gọi trả về:

>>> spam = 'Hello, world!'
>>> spam.islower()
False
>>> spam.isupper()
False
>>> 'HELLO'.isupper()
True
>>> 'abc12345'.islower()
True
>>> '12345'.islower()
False
>>> '12345'.isupper()
False

Do các phương thức chuỗi upper()lower() tự trả về các chuỗi, bạn cũng có thể gọi các phương thức chuỗi trên các giá trị chuỗi được trả về đó. Các biểu thức thực hiện điều này sẽ trông giống như một chuỗi các cuộc gọi phương thức. Nhập thông tin sau vào command line:

>>> 'Hello'.upper()
'HELLO'
>>> 'Hello'.upper().lower()
'hello'
>>> 'Hello'.upper().lower().upper()
'HELLO'
>>> 'HELLO'.lower()
'hello'
>>> 'HELLO'.lower().islower()
True

Những phương thức isX()
Cùng với islower () và isupper (), có một số phương thức chuỗi khác có tên bắt đầu bằng từ is này. Các phương thức này trả về giá trị Boolean mô tả bản chất của chuỗi. Dưới đây là một số phương thức chuỗi isX() phổ biến:
isalpha() Trả về True nếu chuỗi chỉ bao gồm các chữ cái và không trống.
isalnum() Trả về True nếu chuỗi chỉ bao gồm các chữ cái và số và không trống.
isdecimal() Trả về True nếu chuỗi chỉ chứa các ký tự số và không trống.
isspace() Trả về True nếu chuỗi chỉ bao gồm khoảng trắng, tab và dòng mới và không trống
istitle() Trả về True nếu chuỗi chỉ bao gồm các từ bắt đầu với một chữ cái viết hoa theo sau chỉ các chữ cái viết thường.
Nhập đoạn mã sau vào command line:

>>> 'hello'.isalpha()
True
>>> 'hello123'.isalpha()
False
>>> 'hello123'.isalnum()
True
>>> 'hello'.isalnum()
True
>>> '123'.isdecimal()
True
>>> ' '.isspace()
True
>>> 'This Is Title Case'.istitle()
True
>>> 'This Is Title Case 123'.istitle()
True
>>> 'This Is not Title Case'.istitle()
False
>>> 'This Is NOT Title Case Either'.istitle()
False

Các phương thức chuỗi isX() rất hữu ích khi bạn cần xác thực đầu vào của người dùng. Ví dụ, chương trình sau liên tục hỏi người dùng về tuổi và mật khẩu cho đến khi họ cung cấp đầu vào hợp lệ. Mở một cửa sổ soạn thảo văn bản và nhập chương trình này, lưu nó dưới dạng validateInput.py:

while True:
	print('Enter your age:')
	age = input()
	if age.isdecimal():
		break
	print('Please enter a number for your age.')
while True:
	print('Select a new password (letters and numbers only):')
	password = input()
	if password.isalnum():
		break
	print('Passwords can only have letters and numbers.')

Trong vòng lặp while đầu tiên, chúng tôi hỏi người dùng về tuổi của họ và lưu trữ đầu vào theo biến age. Nếu age là giá trị hợp lệ (thập phân), chúng ta thoát ra khỏi vòng lặp while đầu tiên này và chuyển sang vòng thứ hai, yêu cầu nhập mật khẩu. Mặt khác, nếu họ không nhập số chúng ta thông báo cho người dùng rằng họ cần nhập số và yêu cầu họ nhập tuổi. Trong vòng lặp while thứ hai, chúng ta yêu cầu mật khẩu, lưu trữ đầu vào của người dùng trong biến password và thoát ra khỏi vòng lặp nếu đầu vào là chữ và số. Nếu password được nhập vào không đúng như vậy, chúng ta sẽ hiển thị thông báo với người dùng mật khẩu cần phải là chữ và số và yêu cầu họ nhập mật khẩu.
Khi chúng ta chạy chương trình trên. Chúng sẽ được hiển thị như sau

Enter your age:
forty two
Please enter a number for your age.
Enter your age:
42
Select a new password (letters and numbers only):
secr3t!
Passwords can only have letters and numbers.
Select a new password (letters and numbers only):
secr3t

Gọi isdecimal()isalnum() trên các biến, chúng tôi có thể kiểm tra xem các giá trị được lưu trong các biến đó có phải là thập phân hoặc chữ và số hay không. Ở đây, các thử nghiệm này giúp chúng tôi từ chối đầu vào forty two nhưng chấp nhận 42 cho biến age và từ chối secr3t! nhưng chấp nhận secr3t cho biến password.
Các phương thức startswith() và endswith()
Các phương thức startedwith()endswith() trả về True nếu giá trị chuỗi chúng được gọi khi bắt đầu hoặc kết thúc (tương ứng) với chuỗi được truyền cho phương thức; nếu không, trả về False. Nhập thông tin sau vào command line:

>>> 'Hello, world!'.startswith('Hello')
True
>>> 'Hello, world!'.endswith('world!')
True
>>> 'abc123'.startswith('abcdef')
False
>>> 'abc123'.endswith('12')
False
>>> 'Hello, world!'.startswith('Hello, world!')
True
>>> 'Hello, world!'.endswith('Hello, world!')
True

Các phương thức này là các lựa chọn thay thế hữu ích cho toán tử == nếu bạn chỉ cần kiểm tra xem phần đầu tiên hoặc phần cuối của chuỗi, chứ không phải toàn bộ, có bằng chuỗi khác không.
Các phương thức join() và split()
Phương thức join() hữu ích khi bạn có một danh sách các chuỗi cần được nối với nhau thành một giá trị chuỗi duy nhất. Phương thức join() được gọi trên một chuỗi, được thông qua một danh sách các chuỗi và trả về một chuỗi. Chuỗi trả về là nối của các chuỗi trong danh sách truyền vào. Ví dụ: nhập thông tin sau vào command line:

>>> ', '.join(['cats', 'rats', 'bats'])
'cats, rats, bats'
>>> ' '.join(['My', 'name', 'is', 'Simon'])
'My name is Simon'
>>> 'ABC'.join(['My', 'name', 'is', 'Simon'])
'MyABCnameABCisABCSimon'

Lưu ý rằng các lệnh join() được chèn vào giữa mỗi chuỗi đối số danh sách. Ví dụ: khi join([‘cats’, ‘rats’, ‘bats’]) được gọi trên chuỗi ‘,’, chuỗi được trả về là ‘cats, rats, bats’.
Hãy nhớ rằng join() được gọi trên một giá trị chuỗi và được thông qua một giá trị danh sách. (Nó có thể dễ dàng vô tình gọi nó theo cách khác.) Phương thức split() thực hiện ngược lại: Nó đã gọi trên một giá trị chuỗi và trả về một danh sách các chuỗi con. Nhập thông tin sau vào command line:

>>> 'My name is Simon'.split()
['My', 'name', 'is', 'Simon']

Theo mặc định, chuỗi ‘My name is Simon’ được phân chia ở bất kỳ nơi nào có các ký tự khoảng trắng như khoảng trắng, tab hoặc ký tự dòng mới. Các ký tự khoảng trắng này không được bao gồm trong các chuỗi trong danh sách được trả về. Bạn có thể truyền một chuỗi phân cách cho phương thức split() để chỉ định một chuỗi khác để phân tách. Ví dụ: nhập thông tin sau vào command line:

>>> 'MyABCnameABCisABCSimon'.split('ABC')
['My', 'name', 'is', 'Simon']
>>> 'My name is Simon'.split('m')
['My na', 'e is Si', 'on']

Một cách sử dụng phổ biến của split() là phân tách một chuỗi nhiều dòng, dọc theo các ký tự dòng mới. Nhập thông tin sau vào vỏ command line:

>>> spam = '''Dear Alice,
How have you been? I am fine.
There is a container in the fridge
that is labeled "Milk Experiment."
Please do not drink it.
Sincerely,
Bob'''
>>> spam.split('\n')
['Dear Alice,', 'How have you been? I am fine.', 'There is a container in the fridge', 'that is labeled "Milk Experiment."', '', 'Please do not drink it.', 'Sincerely,', 'Bob']

Truyền split() đối số ‘\ n’ cho phép chúng tôi phân tách chuỗi đa dòng được lưu trữ trong spam dọc theo dòng mới và trả về một danh sách trong đó mỗi mục tương ứng với một dòng của chuỗi.
Phân tách chuỗi với phương thức partition()
Phương thức chuỗi partition() có thể phân tách một chuỗi thành văn bản trước và sau chuỗi hoặc kí tự phân tách. Phương thức này tìm kiếm chuỗi mà nó được gọi cho chuỗi hoặc kí tự phân tách mà nó được truyền và trả về một bộ ba chuỗi con cho các chuỗi trước, chuỗi hoặc kí tự phân tách tách chuỗi ra một cách khác nhau Nhập thông tin sau vào vỏ command line:

>>> 'Hello, world!'.partition('w')
('Hello, ', 'w', 'orld!')
>>> 'Hello, world!'.partition('world')
('Hello, ', 'world', '!')

Nếu chuỗi phân tách bạn chọn trong partition() xảy ra nhiều lần trong chuỗi mà phân partition() gọi, phương thức này chỉ phân tách chuỗi trong lần xuất hiện đầu tiên nghĩa là nếu chuỗi có nhiều kí tự trùng với đối số trong partition() thì chuỗi phân tách chỉ tách ra ở chuỗi hay kí tự đầu tiên khớp với đối số trong partition():

>>> 'Hello, world!'.partition('o')
('Hell', 'o', ', world!')

Nếu đối số trong partition() không trùng với thành phần nào của chuỗi phương thức sẽ trả về chuỗi cũ và 2 chuỗi rỗng.

>>> 'Hello, world!'.partition('XYZ')
('Hello, world!', '', '')

Bạn có thể sử dụng nhiều biến gán cho phương thức partition()

>>> before, sep, after = 'Hello, world!'.partition(' ')
>>> before
'Hello,'
>>> after
'world!'

Phương thức partition() rất hữu ích để phân tách một chuỗi bất cứ khi nào bạn cần các phần trước, trong và sau một chuỗi phân tách cụ thể.
Điều chỉnh văn bản với các phương thức rjust(), ljust(), và center()
Các phương thức chuỗi rjust()ljust() trả về một phiên bản đệm của chuỗi mà chúng được gọi, với các khoảng trắng được chèn để điều chỉnh chuỗi. Đối số đầu tiên cho cả hai phương thức là độ dài nguyên cho chuỗi được điều chỉnh. Nhập thông tin sau vào command line:

>>> 'Hello'.rjust(10)
'     Hello'
>>> 'Hello'.rjust(20)
'                    Hello'
>>> 'Hello, World'.rjust(20)
'        Hello, World'
>>> 'Hello'.ljust(10)
'Hello     '

‘Hello’.rjust(10) các ký tự trong ‘Hello’ sẽ được điều chỉnh. ‘Hello’ có 5 kí tự, với phương thức rjust(10) nó sẽ thêm 5 kí tự vào bên trái chuỗi ‘Hello’. Đối số thứ hai tùy chọn thành rjust()ljust() sẽ chỉ định một ký tự điền khác với ký tự khoảng trắng. Nhập thông tin sau vào command line:

>>> 'Hello'.rjust(20, '*')
'***************Hello'
>>> 'Hello'.ljust(20, '-')
'Hello---------------'

Phương thức chuỗi center() hoạt động như ljust()rjust() nhưng căn giữa văn bản thay vì chỉ nó ở bên trái hoặc bên phải. Nhập thông tin sau vào command line:

>>> 'Hello'.center(20)
' Hello '
>>> 'Hello'.center(20, '=')
'=======Hello========'

Các phương pháp này đặc biệt hữu ích khi bạn cần in dữ liệu dạng bảng có khoảng cách chính xác. Mở một cửa sổ soạn thảo văn bản mới và nhập mã sau đây, lưu nó dưới dạng picnicTable.py:

def printPicnic(itemsDict, leftWidth, rightWidth):
	print('PICNIC ITEMS'.center(leftWidth + rightWidth, '-'))
	for k, v in itemsDict.items():
		print(k.ljust(leftWidth, '.') + str(v).rjust(rightWidth))

picnicItems = {'sandwiches': 4, 'apples': 12, 'cups': 4, 'cookies': 8000}
printPicnic(picnicItems, 12, 5)
printPicnic(picnicItems, 20, 6)

Chương trình khi chạy được hiển thị như sau

---PICNIC ITEMS--
sandwiches..    4
apples......   12
cups........    4
cookies..... 8000
-------PICNIC ITEMS-------
sandwiches..........    4
apples..............   12
cups................    4
cookies............. 8000

Sử dụng rjust(), ljust()center() cho phép bạn đảm bảo rằng các chuỗi được căn chỉnh gọn gàng, ngay cả khi bạn không chắc chắn chuỗi của bạn dài bao nhiêu ký tự.
Loại bỏ khoảng trắng với các phương thức strip(), rstrip(), và lstrip()
Đôi khi bạn có thể muốn loại bỏ các ký tự khoảng trắng (dấu cách, tab và dòng mới) từ bên trái, bên phải hoặc cả hai bên của chuỗi. Phương thức chuỗi strip() sẽ trả về một chuỗi mới mà không có bất kỳ ký tự khoảng trắng nào ở đầu hoặc cuối. Các phương thức lstrip () và rstrip () sẽ loại bỏ các ký tự khoảng trắng từ đầu bên trái và bên phải. Nhập thông tin sau vào command line:

>>> spam = '      Hello, World      '
>>> spam.strip()
'Hello, World'
>>> spam.lstrip()
'Hello, World      '
>>> spam.rstrip()
'      Hello, World'

Tùy chọn, một đối số chuỗi sẽ chỉ định các ký tự ở cuối nên được loại bỏ. Nhập thông tin sau vào command line:

>>> spam = 'SpamSpamBaconSpamEggsSpamSpam'
>>> spam.strip('ampS')
'BaconSpamEggs'

Truyền strip() đối số ‘ampS’ sẽ cho nó biết các dải xuất hiện của a, m, p và S từ các đầu và cuối của chuỗi được lưu trữ trong spam. Thứ tự của các ký tự trong chuỗi được truyền cho strip() không quan trọng: dải (‘ampS’) sẽ thực hiện tương tự như dải (‘mapS’) hoặc dải (‘Spam’).
Người dịch: Hungdh

2 Likes