Python print()函数end与sep参数详解及缓冲区刷新问题
本文详细解析Python中print()函数的end和sep参数用法。end参数用于控制输出结尾,默认为换行符\n,可设为空字符串或空格以改变输出格式;sep参数用于分隔多个输出对象。此外,文章指出了在PyCharm等环境中因缓冲区机制导致的输出延迟问题,并提供了使用flush参数或sys.stdout.flush()强制刷新的解决方案。
在近期进行的Python学习过程中,我对print()这一打印输出函数进行了更深入的研究。
在Python 2.6版本中,使用print语句输出内容时必须使用引号包裹。
到了Python 3.0版本,print被修改为函数形式,语法由引号改为括号,即print()。
使用print()函数进行打印输出时,默认行为是在输出的文本末尾添加换行符。
i=1
while i<10:
print(i)
i+=1
print("循环结束")
#程序运行结果
1
2
3
4
5
6
7
8
9
循环结束
从语法结构来看,Python 3.0中print函数的标准格式如下:
print([object,…]],sep=' ‘][,end='\n'][,file=sys.stdout])
需要注意以下几点:
1、方括号[ ]内的参数为可选参数。
2、等号=右侧的值为各参数的默认取值。
file参数
该参数指定文本输出的目标文件、标准流或其他类似文件对象;若未传递该参数,则默认输出至sys.stdout。
sep参数
该参数用于分隔打印输出中的多个对象;若未传递,默认分隔符为一个空格。
print('a','b','c','d','e')
#程序运行结果
a b c d e
print('a','b','c','d','e',sep="下一个字母:")
#程序运行结果
a下一个字母:b下一个字母:c下一个字母:d下一个字母:e
end参数
该参数用于设定打印输出文本的结尾,其默认值为换行符\n。若传递一个空字符串,将避免在打印文本末尾移动到下一行,即后续的print语句会将内容追加到当前输出行的末尾。
i=1
while i<10:
print(i,end=" ")
i+=1
print("循环结束")
#程序运行结果
1 2 3 4 5 6 7 8 9 循环结束
观察可知,每次调用print()时,默认情况下输出并未换行(指未使用默认换行符时的行为,或指通过end参数控制后的效果,原文语境稍显模糊,此处忠实还原:可以看到每次print()的打印输出并未换行)。
接下来,我们通过两段代码来进一步学习end参数的具体作用。
代码一:设定end=" ",即每次打印输出后以空格作为结尾。
i=1
print("九九乘法表")
while i<10:
j=1
while j<=i:
print("{}*{}={}".format(i,j,i*j),end="")#打印输出后以空格结尾
j+=1
print() #未设定end参数,默认end="\n"
i+=1
print("乘法表结束")
代码二:未设定end参数,采用默认值end="\n",即每次打印输出后自动换行。
i=1
print("九九乘法表")
while i<10:
j=1
while j<=i:
print("{}*{}={}".format(i,j,i*j))#默认end="\n"
j+=1
print()
i+=1
print("乘法表结束")
#程序运行结果
九九乘法表
1*1=1
2*1=2
2*2=4
3*1=3
3*2=6
3*3=9
4*1=4
4*2=8
4*3=12
4*4=16
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
6*1=6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
7*1=7
7*2=14
7*3=21
7*4=28
7*5=35
7*6=42
7*7=49
8*1=8
8*2=16
8*3=24
8*4=32
8*5=40
8*6=48
8*7=56
8*8=64
9*1=9
9*2=18
9*3=27
9*4=36
9*5=45
9*6=54
9*7=63
9*8=72
9*9=81
乘法表结束
通过对比上述两段代码的运行结果,我们可以清晰地认识到print()函数中end参数的作用。
补充说明:关于Python函数print()参数end可能存在的坑及解决方法。
Python内置函数print()的语法定义如下:

虽然sep参数和file参数同样具有重要用途,但通常使用较为常规,本文重点介绍end参数以及flush参数。使用print()函数输出给定值后,默认以换行符结束,例如:

如果希望循环输出的内容显示在同一行中,可以修改print()函数的end参数,将其指定为不包含换行符和回车符的字符串,例如:

然而,这种用法可能会带来一个隐藏的陷阱。
函数print()并非直接将内容输出到屏幕(当file参数为默认值时),而是先将内容输出到缓冲区,待缓冲区满或程序运行结束后再刷新到屏幕上,除非采取其他措施强制刷新并清空缓冲区(或输出流)。
以下程序本意是每隔0.5秒输出一个圆点以模拟动态进度条效果,在IDLE或Spyder中运行正常。但在PyCharm和cmd环境中并未实现动画效果,而是等待5秒后一次性输出所有内容。
正如前述,若有其他措施能强制刷新并清空缓存,即可避免此问题。一种方法是使用print()函数的flush参数,另一种方法是调用sys.stdout.flush()函数。
除上述两种方式外,若输出内容中包含回车符\r,也会立即输出到屏幕,从而间接实现上述效果。但需注意,这会覆盖本行已输出的内容,使用时务必谨慎。

以上为个人经验总结,希望能对大家有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









