Python3 print 函数的缓冲机制和sys.stdin 的行为 导致的问题
菜鸟开始刷牛客编程题,从最简单通过率最高的开始--反转字符串
写了一个多小时写出来
import sys
for line in sys.stdin:
for i in range(len(line.strip())-1, -1, -1):
print(line.strip()[i],end="")
调试的过程中,思想是获取长度,从后往前打印,打印出line是带换行符字符串,通过strip()缩减,没有end=""时,每行输出一个字符,顺序是对的,加上end=""就不输出了。困扰好久,然后问kimi,kimi给的代码内循环结束加上print(),输出正常,但不明所以。
import sys
for line in sys.stdin:
for i in range(len(line.strip())-1, -1, -1):
print(line.strip()[i],end="")
print()
再问kimi,解释是print函数缓冲机制和sys.stdin行为导致的:
sys.stdin 的行为:
sys.stdin 是一个文件对象,它会从标准输入中读取内容。当输入结束时,它会等待更多的输入,直到遇到文件结束符(EOF)。
如果你在终端中运行代码,sys.stdin 会一直等待输入,直到你手动发送 EOF(在 Windows 上是 Ctrl+Z,在 Linux/macOS 上是 Ctrl+D)。
Python 的输出缓冲机制:
Python 的 print 函数默认会将输出写入到标准输出(sys.stdout),但标准输出是行缓冲的。这意味着只有当遇到换行符 \n 或缓冲区满时,输出才会被刷新到屏幕上。
如果你没有显式地调用 print(),或者没有在循环中输出换行符,Python 的输出缓冲区可能不会被刷新,因此你不会看到任何输出。
为了确保输出能够被刷新到屏幕上,你可以:
1.显式地调用 print():在每行逆序内容之后调用 print(),确保输出被刷新。
2.使用 flush=True 参数:在 print() 函数中添加 flush=True 参数,强制刷新缓冲区。
import sys
for line in sys.stdin:
for i in range(len(line.strip())-1, -1, -1):
print(line.strip()[i],end="",flush=True)
这样上一次输出会和当前输入粘在一起(不回车的话), 不够优雅,还是print()打印个空行比较好。
看题解时看到大佬一行解决
print(input()[::-1])
或
print("".join(reversed(input()))) #不能去掉"".join(),否则返回reversed对象。reversed()返回一个可以逐个访问元素的迭代器。"".join()将可迭代对象中的所有元素拼接起来。
如果是列表可以使用
s.reverse() #原地反转
无地自容!
阅读剩余
版权声明:
作者:konoha
链接:https://konoha.cc/python3-print-%e5%87%bd%e6%95%b0%e7%9a%84%e7%bc%93%e5%86%b2%e6%9c%ba%e5%88%b6%e5%92%8csys-stdin-%e7%9a%84%e8%a1%8c%e4%b8%ba-%e5%af%bc%e8%87%b4%e7%9a%84%e9%97%ae%e9%a2%98.html
文章版权归作者所有,未经允许请勿转载。
THE END