print['\b' * len[positionStr], end='', flush=True]
6print['\b' * len[positionStr], end='', flush=True]
7print['\b' * len[positionStr], end='', flush=True]
8print['\b' * len[positionStr], end='', flush=True]
9print['\b' * len[positionStr], end='', flush=True]
0print['\b' * len[positionStr], end='', flush=True]
1print['\b' * len[positionStr], end='', flush=True]
2print['\b' * len[positionStr], end='', flush=True]
3print['\b' * len[positionStr], end='', flush=True]
4print['\b' * len[positionStr], end='', flush=True]
5print['\b' * len[positionStr], end='', flush=True]
70print['\b' * len[positionStr], end='', flush=True]
71print['\b' * len[positionStr], end='', flush=True]
72 Nếu bạn đã liên lạc với cộng đồng Python tương đối gần đây, có lẽ bạn đã nghe nói về
print['\b' * len[positionStr], end='', flush=True]
9. print['\b' * len[positionStr], end='', flush=True]
9 mang màu sắc đến nhà ga. không gặp nhiều rắc rốiHai dòng này hiển thị
print['\b' * len[positionStr], end='', flush=True]
1 ghi đè hàm print['\b' * len[positionStr], end='', flush=True]
2 tích hợp của Python. Một điều khiến tôi chú ý là chuỗi tài liệu của print['\b' * len[positionStr], end='', flush=True]
1, đặc biệt là dòng nàytuôn ra [bool, tùy chọn]. Không có tác dụng vì Giàu luôn tuôn ra đầu ra. Mặc định là sai
Tôi hiếm khi sử dụng thông số này. Nhưng tôi nhớ một nơi mà tôi đã nhìn thấy nó - tài liệu về chuột của
print['\b' * len[positionStr], end='', flush=True]
4 nơi Al Sweigart đưa ra ví dụ mã này hiển thị tọa độ con trỏ của bạn #! python3
import pyautogui, sys
print['Press Ctrl-C to quit.']
try:
while True:
x, y = pyautogui.position[]
positionStr = 'X: ' + str[x].rjust[4] + ' Y: ' + str[y].rjust[4]
print[positionStr, end='']
print['\b' * len[positionStr], end='', flush=True]
except KeyboardInterrupt:
print['\n']
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Vì vậy, thực sự.
print['\b' * len[positionStr], end='', flush=True]
5 làm gì?tuôn ra làm gì?
Không cần vòng vo thêm nữa, hãy tiếp tục và chạy tập lệnh này
print['\b' * len[positionStr], end='', flush=True]
5 không ảnh hưởng đến đầu ra. Những gì nó thay đổi là cách nó được inĐây là những phát hiện của tôi
0 [có, mặc định] sẽ đợi dòng hoàn thành trước khi inprint['\b' * len[positionStr], end='', flush=True]
1 sẽ buộc thiết bị đầu cuối của chúng tôi in nóprint['\b' * len[positionStr], end='', flush=True]
5 không thành vấn đề nếuprint['\b' * len[positionStr], end='', flush=True]
3print['\b' * len[positionStr], end='', flush=True]
Bây giờ điều này đặt ra câu hỏi, tại sao?
in, hệ thống. thiết bị xuất chuẩn và PYTHONUNUNBUFERED
Dưới đây là câu đầu tiên từ tài liệu in của Python
print[*objects, sep=' ', end='\n', file=sys. stdout, flush=False]
In6 ra luồng văn bảnprint['\b' * len[positionStr], end='', flush=True]
7, phân tách bằngprint['\b' * len[positionStr], end='', flush=True]
8 và theo sau làprint['\b' * len[positionStr], end='', flush=True]
9.print['\b' * len[positionStr], end='', flush=True]
Thành thật mà nói, khi lần đầu tiên tôi viết chương trình Hello World của mình bằng Python, tôi đã không xem qua tài liệu để thấy kinh ngạc khi triển khai nó. Bây giờ tôi đã nhìn thấy nó, tôi có thể suy ra rằng đầu ra của thiết bị đầu cuối là một "luồng văn bản" theo mặc định là
print['\b' * len[positionStr], end='', flush=True]
90Từ các tài liệu
91 được sử dụng cho đầu ra củaprint['\b' * len[positionStr], end='', flush=True]
92 vàprint['\b' * len[positionStr], end='', flush=True]
93 và cho lời nhắc củaprint['\b' * len[positionStr], end='', flush=True]
94print['\b' * len[positionStr], end='', flush=True]
Các luồng này là các tệp văn bản thông thường giống như các tệp được trả về bởi hàm
95print['\b' * len[positionStr], end='', flush=True]
Khi tương tác, luồng xuất chuẩn được đệm theo dòng. Mặt khác, nó được chặn vào bộ đệm giống như các tệp văn bản thông thường. Bạn có thể làm cho cả hai luồng không có bộ đệm bằng cách chuyển tùy chọn dòng lệnh
96 hoặc đặt biến môi trườngprint['\b' * len[positionStr], end='', flush=True]
97print['\b' * len[positionStr], end='', flush=True]
Rõ ràng là có một cái hố sâu để đào vào cái này. Nhiều lập trình viên có kinh nghiệm hơn có thể sẽ nhận ra
print['\b' * len[positionStr], end='', flush=True]
97 trong Dockerfiles của họ. Chúng tôi cũng có thể muốn biết sự khác biệt giữa bộ đệm dòng và bộ đệm khối. Cá nhân tôi đã biết về print['\b' * len[positionStr], end='', flush=True]
99 hiện cóNhưng hiện tại, chúng ta có thể thoải mái khi biết rằng đầu ra của thiết bị đầu cuối khá giống với một tệp văn bản thông thường được đọc từ đâu đó. Do đó, theo mặc định,
print['\b' * len[positionStr], end='', flush=True]
2 sẽ ưu tiên hoàn thành một dòng trước khi đưa ra kết quả.Nhưng điều này ảnh hưởng đến
print['\b' * len[positionStr], end='', flush=True]
5 như thế nào?- Đặt PYTHONUNBUFFERED qua dòng lệnh. Tôi sử dụng Windows nên trong PowerShell, nó giống như
92. Điều này sẽ ghi đèprint['\b' * len[positionStr], end='', flush=True]
0. Nó cũng ghi đè lênprint['\b' * len[positionStr], end='', flush=True]
94print['\b' * len[positionStr], end='', flush=True]
- Mô-đun
95 [tôi. e. ,print['\b' * len[positionStr], end='', flush=True]
96] KHÔNG ghi đè lênprint['\b' * len[positionStr], end='', flush=True]
0print['\b' * len[positionStr], end='', flush=True]
- Qua cờ python -u. Cờ
96 ghi đèprint['\b' * len[positionStr], end='', flush=True]
0 bất kể giá trị PYTHONUNBUFFEREDprint['\b' * len[positionStr], end='', flush=True]
Giờ thì sao?
Chúng ta hãy quay trở lại mã chuột của Al Sweigart. Dòng này thực sự thú vị
print['\b' * len[positionStr], end='', flush=True]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
cảnh báo spoiler. bạn có thể xóa đối số từ khóa
print['\b' * len[positionStr], end='', flush=True]
1. Ký tự print['\b' * len[positionStr], end='', flush=True]
11 là backspace và đã đủ để xóa print['\b' * len[positionStr], end='', flush=True]
12. Có lẽ nó chỉ hiển thị một số song song giữa mã này và mã Python 2 ngay bên dưới nó. Tuy nhiên, bạn có thể chơi với dòng này — thay đổi print['\b' * len[positionStr], end='', flush=True]
9, sửa đổi print['\b' * len[positionStr], end='', flush=True]
14, thậm chí bạn có thể thay đổi vòng lặpNhưng
print['\b' * len[positionStr], end='', flush=True]
5 sẽ làm gì ở đây?