你会Python吗,python需要注意的问题
毫无疑问,打印功能是我们日常生活中最常用的功能。无论是打印格式,还是打印调试的中间变量,几乎没有打印做不到的工作。
不过上次啊酱差点被印坑了。
00-1010本来想给自己的一个命令行小工具增加一个进度显示功能,于是就用了线程模块来实现多线程。一个线程用于执行实际的逻辑,另一个线程用于打印当前的进度。
点击并拖动根据我们的移动。
经过多年的命令行使用经验,一般的打印进度都是行内打印,而Python的打印
默认会在末尾打印一个换行符,非常不美观。
幸运的是,print还提供了一个改变打印结束字符的接口。通过指定打印的结束参数,可以更改打印的打印结果。
于是我开始嗡嗡嗡,把打印进度的print(# )调用改成print(# ,end= )。
像这样:
单击并拖动以移动它。但是这种改变有一个很大的问题:不能实时打印进度。
单击并拖动以移动。也就是说,打印出来的#数字不应该是程序执行过程中听话可爱的#数字,而是会在整个程序执行完成后一次性输出到控制台。
它长大了,也变丑了.
点击拖动移动,那我问你有什么用?
单击并拖动以移动
坑从何来
。一开始阿江以为多线程有问题,傻乎乎的到处找资料“证明”自己的各种猜测。3354,后知后觉,太傻了,现在还会是哈哈哈。单击并拖动以移动。这件事的教训是:不要自以为是,要脚踏实地解决问题,虚心对待每一个细节。
其实我们看不到实时输出的原因是因为我们改变了print的结尾字符。
为了尽量减少I/O操作,Python有这样一种机制:尽可能缓存输出字符,遇到字符串结束、换行符或缓冲区强制刷新时,只将缓冲区的内容一次性输出到对应的流中。
3354我们所改变的是,我们删除了print的默认换行符,所以最初每次打印都会触发缓冲区刷新,但现在它直到程序结束才能触发缓冲区刷新。
嗯,知道了问题是什么,我们又在找资料了。听说sys.stdout.flush可以强制触发标准输出缓冲区的刷新,所以在print之后,我们增加了sys.stdout.flush()。
呃?这不是很好吗?
还有点击拖拽移动这些都是知识点,赶紧记下来,你要考的东西。
然后单击拖放进行移动。让我们来看看印刷的官方文件。它的原型是:
单击并拖动以移动。根据下面的描述,Python中print的输出是否缓冲取决于两个参数:file和flush。
有些类型的文件需要缓冲,比如sys.stdout而另一些则不需要缓冲,比如sys.stderr
对于flush参数,当其值为False(默认)时,是否缓冲依赖文件;当它的值为True时,缓冲区将被强制刷新。
让我们修改示例调用中的打印调用:
点击拖动移动点击拖动移动实时打印也可以实现进度。
另外,还有一种方法是在调用程序时添加-u选项,也可以实现缓冲区的实时刷新:
单击并拖动以移动。单击并拖动以移动。当然不推荐这种方法。毕竟你不能对程序的使用者做任何预设。
00-1010这篇文章是阿江踩坑的记录,记录了Python中很少有人会遇到的一个奇妙问题。
总的来说,要成为一个真正的Python程序员,仅仅掌握基本的语法和一些小技巧是远远不够的,还是需要对Python本身有所了解。
毕竟一个剑客如果不熟悉自己的剑,又怎么能在江湖上行走呢?
相关免费学习推荐:python视频教程
这些都是很多人在使用Python时走过的坑!对冲!更多详情请关注盛行IT软件开发工作室的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。