sys.stdout.write和print有什么区别?

511

在何种情况下,sys.stdout.write()print更优?

(例如:更好的性能;更合理的代码)


6
Python的哪个版本?2.x还是3.x? - Mark Byers
老实说,我想了解两者的情况,尽管我没有使用过Python 3。问题已经更新。 - Johanna Larsson
28
请求了解sys.stdout.write()print之间的基本区别(以及Python为什么会有两者)是一个非常合理的问题,并且并不需要示例。原帖中并没有说命令语法令人困惑。 - smci
16个回答

2
在Python 2中,如果需要传递一个函数,那么可以将os.sys.stdout.write赋值给一个变量。在REPL中你不能使用print来做到这一点。
>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>

那个按预期工作。
>>> cmd=print
  File "<stdin>", line 1
    cmd=print
            ^
SyntaxError: invalid syntax

那不起作用。`print`是一个神奇的函数。

2
在Python 3中,使用print而不是sys.stdout.write有合理的理由,但这个理由也可以成为使用sys.stdout.write的理由。
这个理由是,在Python 3中,print是一个函数,你可以覆盖它。所以你可以在简单的脚本中到处使用print,并决定哪些print语句需要写入stderr。现在你只需重新定义print函数,甚至可以使用内置模块改变print函数全局。当然,使用file.write你可以指定文件,但通过重写print,你也可以重新定义行分隔符或参数分隔符。
另一种方法是,也许你绝对确定要写入stdout,但也知道你将把print更改为其他内容,你可以决定使用sys.stdout.write,并将print用于错误日志或其他内容。
因此,你使用什么取决于你打算如何使用它。print更加灵活,但这也可以成为使用和不使用它的原因。我仍然选择灵活性,并选择print。另一个使用print的原因是熟悉度。更多人会知道你的意思是print,而不是sys.stdout.write。

2
“sys.stdout.write()是否比print更可取?”
我发现在多线程情况下,stdout比print更好用。我使用一个队列(FIFO)来存储要打印的行,并且在我的打印队列为空之前,我会暂停所有线程。即使如此,在使用print时,有时候会丢失调试I/O上的最后一个\n(使用Wing Pro IDE)。当我在字符串中使用std.out和\n时,调试I/O正确地格式化,并且\n被准确地显示。

1
你知道为什么在这种情况下stdout比print更好用吗?还是这只是个轶事?你能提供一个最小的工作示例来证明这一点吗? - user2653663
我的想法是stdout在比print更低的层面上工作。我肯定有线程损坏,因为两个打印例程正在争夺通过stdout进行喂养。每个线程都写入stdout可以为我消除损坏。 - David Poundall

1

在什么情况下使用sys.stdout.write()比print更好?

例如,我正在编写一个小函数,根据传递的数字以金字塔格式打印星号,尽管您可以使用end=""在单独的一行中打印,但我使用了sys.stdout.writeprint协作来实现这个功能。要详细说明,stdout.write会在同一行上打印,而print始终会在单独的一行上打印其内容。

import sys

def printstars(count):

    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1

printstars(5)

1

其中一个区别在于,当尝试将一个字节打印成其十六进制形式时。例如,我们知道十进制值为255的十六进制表示为0xFF

val = '{:02x}'.format(255)

sys.stdout.write(val) # Prints ff2
print(val)            # Prints ff

1
这不是重点。这只会在交互式 shell 中发生,因为... write() 没有添加 \n 并返回(交互式 shell 显示)函数的返回值(写入的字符数),十六进制表示或任何其他显示的内容都是无关紧要的。 - Ondrej K.

1

您问道:

sys.stdout.writeprint有什么区别?

我知道的最好的解释方法就是向您展示如何用sys.stdout来实现print

下面提供了三种不同的实现python的print函数的方法:

实现方法1

import sys

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation One
    file.write(sep.join(str(arg) for arg in args))
    file.write(end)

实现方式2

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # Implementation 2    
    file.write(str(args[0]))
    for arg in args[1:]:
        file.write(sep)
        file.write(str(arg))
    file.write(end)
    return

实现3

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation 3 
    it = iter(args)
    arg = next(it)
    file.write(str(arg))
    try:
        while True:
            arg = next(it)
            file.write(sep)
            file.write(str(arg))
    except StopIteration:
        pass
    file.write(end)
    return None

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接