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()  #原地反转

 

无地自容!

 

 

 

阅读剩余
THE END