在 Python 中,`print` 函数的 `flush` 参数是一个布尔值,默认值为 `False`。当设置为 `True` 时,它会强制将输出缓冲区的内容立即刷新到目标设备(通常是控制台),而不是等待缓冲区满或者程序结束时才输出。
要注意flush参数在Python 3.3 之前的版本中并不存在,如果仍然使用python2,此处要特别处理。
flush的作用原理
- **输出缓冲机制**
Python的标准输出(`stdout`)默认使用**行缓冲**:
-
遇到换行符(`\n`)时自动刷新缓冲区
-
缓冲区填满时自动刷新
-
程序正常退出时自动刷新
- **`flush=True`的作用**
强制立即刷新缓冲区,将内容写入输出设备(如终端/文件),无需等待换行或填满缓冲区。
**使用方法**
```python
print("内容", flush=True) # 直接添加参数
```
**Python 3.3之前的版本**
需通过`sys.stdout`手动刷新:
```python
import sys
print("内容")
sys.stdout.flush() # 手动刷新
```
模拟进度条
在实现进度条时,我们希望每更新一次进度就立即显示出来,而不是等整个进度条更新完成后再一次性显示。这时候就可以使用 `flush=True` 来实现。
```python
import time
模拟一个 10 步的任务
for i in range(10):
计算进度百分比
progress = (i + 1) * 10
构建进度条字符串
bar = '#' * (i + 1) + '-' * (9 - i)
输出进度条信息,并使用 flush=True 立即刷新
print(f'\r[{bar}] {progress}%', end='', flush=True)
模拟任务执行时间
time.sleep(0.5)
print() # 最后换行
```


实时日志输出
在一些需要实时显示日志信息的场景中,使用 `flush=True` 可以确保日志信息及时显示。
```python
import time
def log_message(message):
输出日志信息,并使用 flush=True 立即刷新
print(f'[{time.strftime("%Y-%m-%d %H:%M:%S")}] {message}', flush=True)
模拟一些操作
for i in range(5):
log_message(f'Processing step {i + 1}...')
time.sleep(1)
log_message('Task completed.')
```

交互式输入输出
在交互式程序中,当你需要在用户输入前显示提示信息时,使用 `flush=True` 可以确保提示信息立即显示,避免用户等待。
```python
print('Please enter your name: ', end='', flush=True)
name = input()
print(f'Hello, {name}!')
```

在上述例子中,使用 `flush=True` 可以确保提示信息 `Please enter your name: ` 立即显示在控制台,让用户能够及时看到并输入信息。
总的来说,print中的flush函数实现的功能就是及时输出,凡是这种场合都可以使用,但是要注意频繁调用对性能损耗。