# 4.4 输出

### 4.3.1 print()

#### 基本语法

print函数的一般语法如下：

print(\[object, …]\[, sep=’ ‘]\[ , end=’\n’]\[, file=sys.stdout]\[, flush=Flalse]

其中, object是需要打印的**对象**，可以是一个也可以是多个。sep表示对象之间的分割符号;end表示结尾字符串；file表示输出流；flush是一个布尔值，True表示刷新输出缓存区，False表示不刷新输出缓存区。如果不人为对sep，end等参数进行设定，那么print函数将会采用上述默认配置进行输出。

如果不向print函数传入任何参数，那么print函数默认向标准输出流打印一个换行符。

例

如果需要打印的内容是一个字符串，通常可以省去print函数，直接对字符串两头加双引号即可。

如：

\>>>”你喜欢Python吗？我很喜欢！”

你喜欢Python吗？我很喜欢！

### 4.3.2 sys.stout

#### 基本语法

我们已经深入学习了print函数的用法及功能，我们同样可以用sys.stout接口来实现，不过稍显复杂。

\>>>import sys

\>>>sys.stdout.write(‘你喜欢Python吗？我很喜欢！\n’)

你喜欢Python吗？我很喜欢！

17（？）

sys.stdout.write的返回值为字符串的个数。因为默认在交互模式下会输出函数返回值，所以最后输出了该字符串的个数。而在命令行里执行已经写好的py脚本，则不会出现这种问题。

值得注意的是，stdout只能输出字符串，如果需要输出数值，必须对其进行类型转换。我们通过str()函数可以完成对数值型向字符串型的转换，也可以通过在数值两旁加” ‘ “号，完成数值向字符串类型的转换。我们可以使用”+”来对字符串进行连接。

通过对sys.stout接口中，write函数的调用，我们可以实现与print函数相同的功能。

下面我们通过输出“我使用python超过10年。“来对print函数和stdout.write在实现同样功能时的语法差异进行总结：

| 方法 | print                            | stdout.write                                   |
| -- | -------------------------------- | ---------------------------------------------- |
| 1  | print(‘我使用python超过10年)           | sys.stdout.write(‘我使用python超过10年\n’)           |
| 2  | print('我使用python超过'+str(10)+'年') | sys.stdout.write(‘我使用python超过’+str(10)+’年’+\n) |

#### 重定向输出流

一般来说，python默认将文本发送到标准输出流。在实际应用中，当面临控制台输出大量信息超出其缓存范围时，控制台会自动对历史信息进行丢弃，这时候我们需要把文本输出到别的地方，例如将文本输出到本地磁盘文件进行保存。这种方式我们称之为**打印流重定向。**

在我们对sys.stdout的输出重定向操作进行讲解前，请先阅读下面一段代码。

\>>>import sys

\>>>temp=sys.stdout #保存默认输出位置

\>>>sys.stdout=open(‘d:/love\_python.txt’, ‘a’) #输出重定向

\>>>print(‘我喜欢python’) #输出

\>>>sys.stdout.close() #关闭重定向，回复默认，将缓存写入硬盘

\>>>sys.stdout=temp #回复默认输出位置

上述代码要完成的功能是向d盘love\_python.txt文件中输入”我喜欢python”。我们通过使用open函数把输出流方向指定为d盘下的love\_python.txt文件。因为反斜杠’\’在字符串中表示转义字符，所以在输入文件绝对路径时，路径分隔符’\’要使用两个连续的反斜杠即’\\\’或一个正斜杠’/’替代。’a’表示，以追加的方式向love\_python.txt文件中写入字符。

print语句会持续调用sys.stdou.write函数，将本应输出到shell中的字符串全部重定向到love\_python.txt文件中。

close函数会将缓存数据写入硬盘。同时会关闭重定向。

这时候，如果我们在此调用print函数，就会报错，提示，ValueError: I/O operation on closed file. 输入输出在一个关闭的文件上。这就使我们产生了疑问，关闭重定向前使用print函数输出的字符串，到底去了哪里？答案是这样的，sys.stdout是一个文件对象，我们既可以对它接收到的字符串进行存储，也可以更改它重定向的位置。我们在使用print函数过程中，先是将字符串流输入到了sys.stdout中，然后调用close函数将这个文件对象关闭，同时将数据写入硬盘。这个时候，再次调用print函数，就会失去将内容输出的对象，我们需要重新对sys.stdout进行定义。通过使用变量temp将原始输出位置储存下来，在重定向输出到磁盘文件结束后，将temp值赋给sys.stdout，即可完成sys.stdout的恢复。

这时候让我们再次使用print打印“我喜欢python”，shell上就会重新显示打印内容了！
