sys.stdout.write和print有什么区别?
有没有一些情况,使用 sys.stdout.write()
比使用 print
更好呢?
(举个例子:性能更好;代码更容易理解)
16 个回答
这里有一些示例代码,来自马克·卢茨的书《学习Python》,这段代码可以帮助你理解你的问题:
import sys
temp = sys.stdout # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123") # nothing appears at interactive prompt
print("another line") # again nothing appears. it's written to log file instead
sys.stdout.close() # ordinary file object
sys.stdout = temp # restore print commands to interactive prompt
print("back to normal") # this shows up in the interactive prompt
用文本编辑器打开log.txt文件,你会看到以下内容:
testing123
another line
print
首先会把你要打印的东西转换成字符串(如果它还不是字符串的话)。如果这个东西不是在行的开头,它还会在前面加一个空格,最后会在后面加一个换行符。
而使用 stdout
的时候,你需要自己把要打印的东西转换成字符串(比如可以用 "str" 函数),而且不会自动加换行符。
所以
print 99
其实和下面这个是一样的:
import sys
sys.stdout.write(str(99) + '\n')
print
其实就是一个简单的工具,它会把你输入的内容格式化一下(你可以修改这个格式,但默认情况下,它会在每个参数之间加一个空格,最后再换行),然后调用一个特定对象的写入功能。默认情况下,这个对象是 sys.stdout
,不过你也可以用“尖括号”形式传入一个文件。比如:
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
详细信息请见: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
在 Python 3.x 中,print
变成了一个函数,但你仍然可以通过 file
参数传入其他的对象,而不仅仅是 sys.stdout
。
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
详细信息请见 https://docs.python.org/3/library/functions.html#print
在 Python 2.6 及以上版本中,print
仍然是一个语句,但你可以用以下方式把它当作函数来使用:
from __future__ import print_function
更新:Bakuriu 提到,print
函数和 print
语句之间有一点小区别(更广泛地说,函数和语句之间也有区别)。
如果在评估参数时发生错误:
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called