使用Python时多少有人走过的坑!避险!-Python教程

资源魔 39 0

毫无疑难, print 函数是咱们一样平常最罕用的函数,无论是格局化输入仍是打印两头变量进行调试,简直不 print 接没有了的活儿。

然而上一次阿酱就差点被 print 给坑了。

坑从何来

最后是想要为本人的一个饬令行小对象添加一个进度显示性能,于是用了 threading 模块来完成多线程,一个线程用于执行实际的逻辑,另外一个线程用于打印以后进度。

点击并拖拽以挪动

依据咱们

多年 应用饬令行的经历,普通打印进度都是外行内打印,而Python的 print

则会默许正在末端打印一个换行符,这就非常没有美了。

不外好正在, print 也提供了接口来扭转打印的末尾字符,经过指定 printend 参数,便可扭转 print 的打印后果。

以是我就哼哧哼哧地开干了,把打印进度的 print("#") 挪用改成 print("#", end="")

相似这样:

点击并拖拽以挪动

哪成想,这么一改却出了年夜成绩:进度没法及时打印了。

点击并拖拽以挪动

也就是说,原本应该正在顺序执行时期,挨个打印进去的 # 号再也不是听话的、可恶的 # 号了,而是正在整个顺序执行实现之后一次性输入到管制台中。

它长年夜了, 也变丑了

点击并拖拽以挪动

那我要你有何用?

点击并拖拽以挪动

啥成绩呢?

一开端阿酱认为是多线程出了成绩,傻乎乎地四处找材料来“左证”本人的各类猜想——预先想来真实太傻了,以至于如今提及仍是会哈哈哈

点击并拖拽以挪动

这件事给咱们的教训就是: 万万没有要自认为是,而应踏虚浮实地处理成绩,谦虚看待每一个细节 。

实际上,之以是咱们看没有到及时的输入,就是由于咱们扭转了 print 的末端字符。

为了只管即便缩小I/O操作,Python存正在一个这样的机制:只管即便将输入字符缓存起来,当遇到字符串完结、换行符或强迫刷新缓冲区时,才会一次性将缓冲区的内容输入到相应的流中。

——而咱们改掉之处,就是把 print 默许的换行符去掉了,以是本来每个 print 城市触发一次缓冲区刷新,变为了如今不断触发没有了缓冲区刷新,直到顺序完结触发一次。

好嘛,晓得了啥成绩,咱们又吭哧吭哧找材料,据说 sys.stdout.flush 能够强迫触发规范输入缓冲区的刷新,于是正在 print 前面,紧随着又加之了 sys.stdout.flush()

诶?还真好了?

点击并拖拽以挪动

这些可都是常识点,快记上去记上去,要考的

点击并拖拽以挪动

让咱们查看 print 的民间文档,其原型为:

点击并拖拽以挪动

依据其下的形容,Python中 print 的输入能否进行缓冲,取决于两个参数: file 以及 flush

file 的类型有的需求缓冲,比方 sys.stdout ;而有的则没有需求缓冲,比方 sys.stderr

关于 flush 参数,当其值为 False (默许)时,能否缓冲依赖 file ;而当其值为 True 时,则会强迫刷新缓冲区。

咱们把示例挪用中的 print 挪用修正一下:

点击并拖拽以挪动
点击并拖拽以挪动

一样能够完成进度的及时打印。

别的,另有一种办法,正在挪用顺序时添加一个 -u 选项,也能够完成缓冲区的及时刷新:

点击并拖拽以挪动
点击并拖拽以挪动

当然这类办法就没有太保举了,究竟结果不克不及对顺序的应用者作任何预设。

总结

本文是阿酱的一次踩坑实录,记载了Python中一个很少有人会遇到的奇葩成绩。

总的来讲,要想成为一个真实的Python顺序员,只是单纯把握根本语法以及一些奇技淫巧是远远不敷的,仍是需求对Python自身有肯定的理解。

究竟结果,剑客假如没有相熟本人的剑,又该若何行走江湖呢?

相干收费学习保举:python视频教程

以上就是应用Python时几何有人走过的坑!避险!的具体内容,更多请存眷资源魔其它相干文章!

标签: Python python教程 python编程 python使用问题

抱歉,评论功能暂时关闭!