1. 程式人生 > >python的print(flush=True)實現動態loading......效果

python的print(flush=True)實現動態loading......效果

python的print(flush=True)實現動態Loading......效果

import time                                                                           
print("Loading",end = "")
for i in range(6):
    print(".",end = '')
    time.sleep(0.2)

想用以上程式碼實現下面動圖效果,即:在Loading同一行後面每0.2秒輸出1個點號,總共6個。
可是上面程式碼效果是;6x0.2秒後1次性輸出Loading……
百度了下相關問題,綜合網友的回答。問題出在:上面那樣迴圈會堵塞輸出,要等sleep全部執行完,才一併打印出全部結果。要在for迴圈裡面的end = ""後面加上flush = True,即:

import time                                                                           
print("Loading",end = "")
for i in range(6):
    print(".",end = '',flush = True)
    time.sleep(0.2)

終於實現了下面效果。(雖然只能動態逐個輸出6個點號1次,不是一直迴圈下去,不過核心問題算是解決了)
在這裡插入圖片描述
我們檢視下help裡面寫的print

print(...)
    print(value, ..., sep=' '
, end='\n', file=sys.stdout, flush=False) ...省略... flush: whether to forcibly flush the stream.

有個引數flush,預設為False。那麼這個引數是幹什麼用的?並且是怎麼用的?
在這裡插入圖片描述
舉個例子:
線上web聊天,頁面會實時顯示聊天的內容, 其實後臺是一直在向伺服器請求資料的, 正常情況下是請求完畢之後才會輸出相應內容, 但是即時聊天,需要一有響應就得立即返回, flush也就起作用了。

再舉個例子
我們知道print也可輸出到檔案。在python3 互動模式中輸入:

f = open
("123.txt", "w") print("123456789", file = f)

執行後開啟123.txt檔案,發現“123456789”未被寫入,檔案內容為空。只有f.close()後才將內容寫進檔案中。如果加入flush = True,即上面程式碼改為:

f = open("123.txt", "w")
print("123456789",file = f, flush = True)

不用f.close()即可將內容寫進檔案中
flush引數主要是重新整理, 預設flush = False,不重新整理,如上面例子,print到f中的內容先存到記憶體中,當檔案物件關閉時才把內容輸出到 123.txt 中;而當flush = True時它會立即把內容重新整理存到 123.txt 中。

初學python,發文只當作筆記,如果有什麼問題歡迎指正