Làm thế nào để bạn tìm thấy dòng cuối cùng của một chuỗi trong python?

Xin chào mọi người, đây là Thijmen, và trong bài viết này, tôi sẽ trình bày hai phương pháp để ghi đè các dòng đã in trước đó trong Python bằng cách sử dụng các chuỗi thoát ANSI

Bài viết này cũng có sẵn ở định dạng video trên YouTube

Hoàn tác các câu lệnh in có thể rất hữu ích nếu bạn muốn cung cấp đầu ra liên tục mà không làm lộn xộn màn hình

Việc triển khai và kết quả dự định hơi khác nhau đối với từng phương pháp, vì vậy phương pháp nào sẽ sử dụng thực sự phụ thuộc vào trường hợp sử dụng của bạn. Ưu và nhược điểm của chúng sẽ trở nên rõ ràng ngay sau khi bạn hiểu cách chúng hoạt động, vì vậy hãy bắt đầu ngay với phương pháp đầu tiên

💡 Trong bài viết này, tôi cung cấp một số thông tin cơ bản giúp bạn hiểu cách thức và lý do các phương pháp này hoạt động. Nếu bạn muốn khắc phục nhanh, có TL;DR ở dưới cùng

Phương pháp 1. Vận chuyển trở lại

Nhanh chóng và đơn giản

Tóm lược

  1. Dòng in, nhưng kết thúc bằng ký tự xuống dòng thay vì ký tự xuống dòng. Điều này di chuyển con trỏ trở lại đầu dòng in
  2. In một dòng khác, nhưng vì con trỏ hiện đang ở đầu dòng trước, kết quả mới sẽ được in ở đầu dòng trước

Tiếp cận

Theo mặc định, câu lệnh print của Python kết thúc mỗi chuỗi được truyền vào hàm bằng một ký tự xuống dòng, \n. Hành vi này có thể được ghi đè bằng tham số end của hàm, đây là cốt lõi của phương pháp này

Thay vì kết thúc đầu ra bằng một dòng mới, chúng tôi sử dụng dấu xuống dòng

Khi chúng ta kết thúc câu lệnh print bằng dấu xuống dòng, về cơ bản, chúng ta sẽ di chuyển con trỏ trở lại đầu dòng được in, thay vì đến dòng tiếp theo. Sau đó, nếu chúng ta in một chuỗi khác, văn bản được in “trên cùng” của chuỗi trước đó. Trong Python, dấu xuống dòng được biểu thị bằng \r

💡 Ban đầu, thuật ngữ “carriage return” dùng để chỉ một cơ chế hoặc đòn bẩy trên máy đánh chữ được vận hành sau khi gõ một dòng văn bản, giúp căn chỉnh phần tử loại của máy về phía bên trái của tờ giấy

Trường hợp ví dụ

Giả sử chúng ta có một chuỗi đơn giản mà chúng ta muốn in từng ký tự, cứ sau 0 lại có một ký tự. 5 giây

Trường hợp ví dụ (chưa ghi đè)

Sử dụng câu lệnh print mặc định, điều này trông giống như vậy

Trường hợp ví dụ (chưa ghi đè)

Bây giờ hãy xem điều gì sẽ xảy ra nếu chúng ta kết thúc mỗi câu lệnh print bằng dấu xuống dòng thay vào đó

Phương pháp 1. Trường hợp ví dụ (có ký tự xuống dòng)

Tất cả các ký tự được in trên cùng một dòng

Phương pháp 1 trong thực tế

Dễ dàng phải không? . Bởi vì về cơ bản, chúng tôi xuất từng câu lệnh print liên tiếp trên đầu ra trước đó, nên việc in một dòng ngắn hơn dòng trước đó là không khả thi.

Xem điều gì sẽ xảy ra nếu chúng ta in 'xong' ở cuối vòng lặp

Lưu ý phương pháp 1. in các dòng ngắn hơn

Chúng tôi có thể ngăn chặn điều này bằng cách xóa dòng trước đó trước khi chúng tôi in một chuỗi ngắn hơn

Trình tự ANSI trên dòng 6 chỉ ra rằng dòng có con trỏ sẽ bị xóa (lưu ý \r ở cuối vòng lặp for). Bằng cách sử dụng biến LINE_CLEAR làm tham số end, chúng tôi đảm bảo rằng không có ký tự xuống dòng bổ sung nào được in

Phương pháp 1. ví dụ làm việc. Phương pháp 2. “Dọn dẹp”

Hơi phức tạp hơn, nhưng đầu ra sạch hơn và linh hoạt hơn

Tóm lược

  1. Dòng in (mặc định kết thúc bằng một dòng mới)
  2. Ngay trước câu lệnh print tiếp theo. di chuyển con trỏ lên và xóa dòng. Hành động này có thể được lặp lại để hoàn tác nhiều dòng đã in
  3. In dòng tiếp theo của bạn

Tiếp cận

Trong phương pháp này, chúng tôi không thay đổi tham số end của câu lệnh print được sử dụng để hiển thị đầu ra của chúng tôi. Thay vào đó, chúng tôi thêm một câu lệnh print bổ sung để xóa dòng trước đó bằng hai mã thoát ANSI

Phương pháp 2. ví dụ làm việc
  1. Mã ANSI được gán cho \n5 chỉ ra rằng con trỏ sẽ di chuyển lên một dòng
  2. Mã ANSI được gán cho LINE_CLEAR xóa dòng có con trỏ (cũng được sử dụng trong phương thức đầu tiên)

Lưu ý rằng chúng tôi đã thay đổi tham số end của câu lệnh print bổ sung để ngăn ký tự xuống dòng mặc định được in

Phương pháp 2 trong thực tế

Về mặt chức năng, phương pháp này cung cấp hai ưu điểm so với phương pháp đầu tiên

  1. Bạn không phải lo lắng về độ dài của dòng tiếp theo
  2. Con trỏ không can thiệp trực quan vào các dòng in

Gọn gàng, phải không?

TL;DR

Chúng ta có cuộc sống bận rộn. tôi hiểu rồi

Nếu bạn học được điều gì đó mới từ bài viết này, vui lòng cân nhắc đăng ký kênh YouTube của tôi. Thanks. 🙂

Bài viết này và video tương ứng là một phần trong chuỗi Python Snippets của tôi, nơi chúng tôi đề cập đến nhiều chủ đề khác nhau xung quanh lập trình Python ở định dạng có kích thước byte