起因于老师写的一小段代码
说实话我从来觉得print()方法有什么特别的,一直都在用
偶尔加个end,sep啥的也都不是问题
但是老师的这句代码我刚开始看的时候居然没明白啥意思,file后面的是一个open的文件对象,我看file分明是一个参数,可是我怎么不知道还有file这个参数,虽然老师写的其他代码也一样看不懂,参数也都不知道,但是!但是print()这个最常用的我居然不知道
赶紧ctrl一下,看了一下源码,还真有这个参数,而且还有一个flush参数一样没见过
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
下面是我搜索资料查到的,外加一点自己的总结
file: --标准输出的目标,默认是控制台,即sys.stdout,可以指定输出到文件
flush: --强制刷新缓存的流,可以在使用print()输出重定向到文件时立即刷新文件的内容
开始重新认识print()
作为一个连程序员都算不上的小白,只能通过查阅资料来解决问题,看源码是不可能看的,看也看不懂。
网上蛮多的下面的例子,具体差不多,可能起源于菜鸟教程,不过菜鸟里面没有说的太清楚。
先看代码:ヾ(・ω・`。)
import time
print('-- Loading: 效果 --')
print('Loading', end=' ')
for i in range(20):
print('\r', '{0}+{1}={2}'.format(i, i + 1, 2 * i + 1), end='', sep='&', flush=True)
time.sleep(0.5)
实现的结果就是实时刷新输出,很多程序高大上的进度条就是这样实现的,虽然大佬都是直接导入sys包,但是print()也相当于调用了sys.stdout.write(),鉴于结果一样,还是先搞清楚print()再去搞sys。
想要实现实时刷新的状态格式不可缺少,下面是我的一些笔记和总结
简单说就是将缓存里面的内容立即输出到标准输出流(这里是sys.stdout, 也就是默认的显示器)
这个功能在客户端脚本几乎用不上, 大多用于服务器端
比如反向Ajax里面就要用到flush, 举个例子: 在线web聊天页面会实时显示聊天的内容, 其实后台是一直在向服务器请求数据的, 正常情况下是请求完毕之后才会输出相应内容, 但是是即时聊天, 需要一有相应就得立即返回, flush也就起作用了
具体的使用flush生效的方法
print('\r' + str(i), end='', flush=True)
前面需要加一个'\r',然后end='', flush=True
标准格式print('\r', 输出内容, end='', flush=True) # end参数不要设置为\r, \n默认就是\n,不会实时刷新,起作用的应该是\r和flush,又需要输出之后不换行,flush实时刷新,加sep参数也不碍事
\r是把光标的位置回退到本行的开头位置
前面需要空格的话可以在\r的后面加\t即
print('\r\t', '输出内容', end='', flush=True)
用来刷新之前的输出内容
具体思想,实时生效\r命令,更改默认换行的end值,实时刷新
好吧,其实一开始关心的是file参数,但是后来查着查着就变成了flush,
file参数就下次再详解吧,我其实蛮关心这个参数可以写入什么格式的文件,具体思想就是重定向
再次查看的时候发现去除flush参数也是可以的,起决定的命令是\r,flush果然是用来写入文件时候刷新的。