Khi bạn đang làm việc với các chuỗi Python, có những lúc bạn sẽ phải đảo ngược chúng và thay vào đó làm việc với các bản sao đã đảo ngược của chúng.
Nhưng vì các chuỗi Python là bất biếnbạn không thể sửa đổi hoặc đảo ngược chúng tại chỗ.
Trong Python, có một số cách khác nhau để bạn có thể thực hiện việc này. Và hướng dẫn này sẽ hướng dẫn bạn cách sử dụng kỹ thuật cắt chuỗi, các phương thức tích hợp sẵn và đệ quy để đảo ngược chuỗi.
🎯 Bạn sẽ học được gì
Vậy hãy bắt đầu.
Cách đảo ngược chuỗi Python bằng đệ quy
Trước khi tìm hiểu cách sử dụng đệ quy để đảo ngược chuỗi, hãy bắt đầu bằng cách tìm hiểu cách thức hoạt động của đệ quy.
Đệ quy là một mô hình lập trình mạnh mẽ. Để giải quyết vấn đề quan tâm, một hàm đệ quy gọi chính nó nhiều lần, cho đến khi một trường hợp cơ bản đạt được.
Chà, đây là những gì bạn có thể đã đọc về đệ quy trước đây.
Bây giờ hãy viết lại định nghĩa đó bằng ngôn ngữ đơn giản.
Đệ quy bằng tiếng Anh đơn giản
Giả sử bạn đã tạo một chức năng để giải quyết vấn đề.
- Hàm này được thiết kế sao cho mỗi khi nó được gọi, nó gọi chính nó lần nữa.
- Chúng được gọi là đệ quy lời gọi hàm.
- Mỗi lệnh gọi hàm đệ quy thực hiện cùng một lượng công việc nhỏ.
- Và điều này tiếp diễn cho đến khi không còn việc gì để làm. Và chức năng không cần phải gọi chính nó nữa – đây được gọi là trường hợp cơ bản.
Cách sử dụng đệ quy để đảo ngược chuỗi
Bây giờ chúng ta hãy thảo luận về động lực đằng sau việc đảo ngược các chuỗi bằng trực giác. Và để làm điều này, hãy xem xét chuỗi "code"
.
Vấn đề: Đảo ngược chuỗi "code"
.

Hãy tạm quên đệ quy trong một thời gian và bắt đầu với những gì bạn biết.
Chữ cái đầu tiên trong chuỗi ban đầu sẽ là chữ cái cuối cùng trong chuỗi đảo ngược, phải không?
- Vì vậy, hãy rút ra chữ cái đầu tiên –
"c"
ở đây – và đẩy nó đến cùng. - Bây giờ bạn còn lại với chuỗi
"ode"
. Và vấn đề đã giảm xuống để đảo ngược chuỗi con này"ode"
[as"c"
is already in the right place]

- Bây giờ, bạn có thể thực hiện nhiệm vụ tương tự là rút ra chữ cái đầu tiên một lần nữa
"o"
. Và đẩy nó vào khe cuối cùng có sẵn ở bên phải. - Bây giờ thì
"c"
và"o"
đã được xử lý xong, bạn sẽ gặp vấn đề về đảo ngược chuỗi con"de"
.

- Làm thêm vài lần nữa – rút ra
"d"
đầu tiên, và sau đó"e"
.

- Bây giờ bạn còn lại với việc đảo ngược
""
– một chuỗi rỗng.

- Đây là khi bạn đã đặt
"e"
,"d"
,"o"
và"c"
ở đúng vị trí và bạn không phải làm điều đó nữa. Trong bối cảnh đệ quy, bạn đã đạt đến trường hợp cơ bản.
Bạn đã làm gì ở đây?
- Trong mỗi bước, bạn thực hiện cùng một nhiệm vụ là rút ra chữ cái đầu tiên trong mỗi chuỗi con tiếp theo.
- Và bạn đã giảm bớt vấn đề để đảo ngược một chuỗi ngắn hơn một chữ cái so với trước đây.
Khi nào bạn dừng lại?
Khi chuỗi là trống rỗng – bạn không còn chữ cái nào để rút ra.
Hình minh họa dưới đây tóm tắt những gì chúng tôi đã thực hiện:

Bây giờ bạn đã hiểu rõ về cách đảo ngược chuỗi thực sự hoạt động bằng cách sử dụng đệ quy, hãy viết một số mã.
Hiểu ngăn xếp cuộc gọi đệ quy
Đây là hàm Python reverseString()
thực hiện chính xác những gì bạn đã học trong phần trước.
Chức năng reverseString()
mất trong any_string
và trả về bản sao đảo ngược của any_string
.
def reverseString(any_string):
if any_string == "":
return any_string
else:
return reverseString(any_string[1:]) + any_string[:1]
Bạn sẽ phải hiểu cách gọi đệ quy được đẩy lên ngăn xếp khi bạn gọi hàm reverseString()
.
reverseString("code")
# Output
'edoc'
- Giả sử, bạn gọi hàm
reverseString()
với"code"
như lập luận. Điều này lần lượt thực hiện một cuộc gọi đếnreverseString()
với"ode"
như lập luận. - Và cuộc gọi này thực hiện cuộc gọi đến
reverseString()
một lần nữa với"de"
như lập luận. - Điều này tiếp tục cho đến khi một cuộc gọi cuối cùng được thực hiện đến
reverseString()
với một chuỗi rỗng""
như lập luận.
Đối với mỗi lệnh gọi hàm, một bản ghi kích hoạt được tạo trong phần ngăn xếp của bộ nhớ máy tính của bạn.
Và mọi bản ghi kích hoạt của lệnh gọi chức năng tiếp theo được đẩy lên trên cùng của ngăn xếp.
Điều này được giải thích trong hình dưới đây:

- Bạn biết rằng khi cuộc gọi được thực hiện với
""
hàm trả về""
nối với"e"
đó chỉ là"e"
. Và bản ghi kích hoạt của nó được bật ra khỏi ngăn xếp. - Cuộc gọi tiếp theo trả về
"ed"
và lần trả về tiếp theo"edo"
. Và bản ghi kích hoạt bật ra khỏi ngăn xếp cuối cùng cũng trở lại"edoc"
đó là chuỗi đảo ngược.
Lưu ý rằng bản ghi kích hoạt tương ứng với từng lệnh gọi đệ quy sẽ được bật ra khỏi ngăn xếp sau khi các giá trị được trả về – như được hiển thị trong lệnh gọi được trả về "e"
.
Để dễ đọc, tôi đã bỏ qua ❌ trong hình minh họa bên dưới. Và các giá trị trả về từ cuộc gọi trước đó đã được chỉ định trong màu xanh lá bên trong ngăn xếp cuộc gọi.

Bây giờ bạn có thể gọi reverseString()
với bất kỳ chuỗi Python hợp lệ nào. Dưới đây là một vài ví dụ khác.
reverseString("Python")

reverseString("Python Reverse String")

Chà, điều đó đòi hỏi khá nhiều nỗ lực. 😓 Nhưng tôi hy vọng bây giờ bạn có thể hiểu các cuộc gọi đệ quy tốt hơn. 😊
Trong hai phần tiếp theo, bạn sẽ thấy các cách đảo ngược chuỗi dễ dàng hơn. Đi nào. ✅
Cách đảo ngược chuỗi Python bằng cách cắt chuỗi
Bạn cũng có thể đảo ngược chuỗi Python bằng cách sử dụng cắt dây. Và bạn có thể cắt qua các chuỗi Python giống như cách bạn cắt qua các danh sách Python.
Giải thích về việc cắt chuỗi Python
<string>[start: stop: step]
trả về một lát của chuỗi – bắt đầu từ chỉ mục start
kéo dài đến hết stop - 1
trong các bước của step
.
Dưới đây là một vài điểm về chuỗi đáng nhớ:
<string>
là bất kỳ chuỗi Python hợp lệ nào.- Các
start
chỉ mục là không bắt buộc. Nếu bạn không chỉ định nó, bởi mặc định, lát cắt bắt đầu từ đầu<string>
(tại chỉ mục).
- Các
stop
chỉ số cũng là không bắt buộc. Nếu bạn không chỉ định nó, bởi mặc định, lát cắt kéo dài đến cuối<string>
. - Các không bắt buộc
step
đối số đưa ra ngữ cảnh về cách bạn muốn cắt qua<string>
. - Hãy thiết lập
step = 2
. Bây giờ, lát cắt sẽ bắt đầu từstart
và đi lênstop - 1
bao gồm mọi ký tự thứ hai trong chuỗi.
Để tất cả chúng cùng nhau, <string>[:::]
trả về một bản sao của toàn bộ chuỗi.
Bạn có thể thấy tại sao điều này là chính xác?🤔
không có start
chỉ mục, lát cắt bắt đầu tại chỉ mục .
không có end
chỉ mục, lát sẽ mở rộng đến ký tự cuối cùng trong chuỗi.
không có step
đối số, lát bao gồm tất cả các ký tự trong chuỗi.
- Bạn cũng có thể thiết lập từ chối giá trị cho
step
. Và các giá trị âm sẽ trả về các lát chuỗi bắt đầu từ chấm dứt của chuỗi. - Bộ
step = -1
: Điều này trả về một lát của chuỗi bắt đầu từ các Cuối cùng nhân vật, mở rộng lên đến các đầu tiên nhân vật. Và nó cũng bao gồm mọi ký tự.
Đợi đã, đây không phải chính xác là chuỗi đảo ngược sao? 🙂 Đúng vậy.
Cho nên <string>[::-1]
trả về một bản sao đảo ngược của chuỗi. ✅
any_string = "Python"
rev_string = any_string[::-1]
print(rev_string)
# Output
nohtyP
Chuyển sang phần tiếp theo để tìm hiểu một cách khác để đảo ngược chuỗi.
Cách đảo ngược chuỗi Python bằng cách sử dụng reversed()
và join()
phương pháp
Hãy bắt đầu bằng cách xem những gì Python reversed()
phương pháp nào.
Python tích hợp sẵn
reversed()
hàm trả về một trình vòng lặp đảo ngược trên các giá trị của một chuỗi đã cho.
any_string = "Python"
Đưa ra một chuỗi như any_string
bạn có thể dùng reversed()
phương pháp để lấy các ký tự theo thứ tự đảo ngược.
Điều này được hiển thị dưới đây:
for char in reversed(any_string):
print(char)

Bây giờ bạn đã có tất cả các ký tự của mình theo thứ tự đảo ngược, bạn cần đặt chúng lại với nhau thành một chuỗi.
Và Python join()
phương pháp cho phép bạn làm điều đó.
<sep>.join(<these>)
tham gia <these>
thành một chuỗi với <sep>
như dải phân cách.
- Đây,
<these>
là các ký tự theo thứ tự đảo ngược. - Nhưng những gì nên
<sep>
thì là ở? Chà, bạn không cần bất kỳ dấu phân cách nào – bạn chỉ muốn tất cả các ký tự đi vào chuỗi ở đúng chỉ mục. - Vậy bạn nên làm gì sau đó? Chỉ cần chèn một
""
bên trong<sep>
trường, như được hiển thị:
"".join(reversed(any_string))

chỉ cần cẩn thận không phải để chèn một khoảng trống giữa phần mở và phần đóng "
.
Nếu bạn làm như sau:
" ".join(reversed(any_string))
Bạn sẽ nhận được một chuỗi trong đó các ký tự được phân tách bằng khoảng trắng và đây không phải là điều bạn muốn.

Trong phần này, bạn đã học được một cách Pythonic khác để đảo ngược các chuỗi Python.
Phần kết luận
Chúc mừng bạn đã làm cho nó đến nay! 🎉
Tóm lại, bạn đã học được:
- cách đảo ngược đệ quy một chuỗi – tiếp tục cho đến khi bạn có một chuỗi rỗng hoặc chỉ có một nhân vật trái (điều này cũng sẽ hoạt động tốt, vì một ký tự bị đảo ngược chính là chính nó),
- cách sử dụng
<string>[::-1]
để có được một bản sao đảo ngược của<string>
và - cách sử dụng
"".join(reversed(<string>))
để có được một bản sao đảo ngược của<string>
.
Hy vọng bạn thấy hướng dẫn này hữu ích và thú vị. Chúc mừng mã hóa! 😄