python的print(flush=True)實現動態loading......效果
阿新 • • 發佈:2019-02-17
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,發文只當作筆記,如果有什麼問題歡迎指正