社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python的"print"函数在“Hello World”之外的延伸

Python程序员 • 7 年前 • 669 次点击  


想必任何一个人学习python的第一件事就是学习怎么去输出字符串“hello world”,就像你期望的那样,这段代码是非常简洁的: 确实,python的“print”函数用起来非常简单直接以至于我们很少对它进行一些思考。我们猜测人们知道如何使用它——而且多数情况下,对于人们想要去做的事,这也是正确的。


但隐藏在“print”功能表面之下还有许多功能,以及一些历史(甚至有点痛苦)。了解如何使用“打印”可以减少你编写的代码,而且通常也会让它对于你来说更加容易使用。

原理


基本原理很简单:“print”是一个函数,这意味着如果要调用它,需要使用括号:

您可以将任何类型的数据传递给“print”。字符串是最常见的,但也可以是int、float、list、tuples、dict、set或任何其他对象。例如:

 或者:

当然,这跟你要传递的参数是无关的,不论是对象字面量或是引用一个变量


你也可以将表达式放在括号内;表达式的值将传递给“print”:

在“print”显示其输出之后,它添加了一个新行。例如

您可以传递任意多的参数来“打印”,将参数用逗号分隔,每一个参数都会按照顺序打印出来,参数中间会有一个空格:

下面我们将看到如何更改这两个默认行为。

输入和输出


如果“print”是一个函数,那么他一定会有返回值,我们看:

换句话说:不管你打印的是什么,“print”都不会有返回值。毕竟你不是为了得到返回值而打印的,而是为了它的另一个作用。


那么“print”的实参呢?已经看到我们可以传递任意数量的实参,它们都会被打印出来。但是有一些可选的形参我们也是可以传递的。


改变输出项之间的字符串显示和改变放在输出末尾的代码,这两点是联系非常紧密的,他们可以让我们自定义我们在前面看到的行为。


例如,参数“sep”,默认为“”(空格字符),被放在打印项之间。我们可以将其设置为任何字符串,包括多字符字符串:

请注意,“sep”放在“print”的参数之间,而不是参数的每个元素之间。因此,在第三个示例中,“**”位于列表之间,而不是列表的整数元素之间。


如果你想让打印的参数一次相连,可以把“sep”设为空字符串:

类似的,参数“end”的默认值是“\n”(换行),但是可以包含任意字符串。他决定了在“print”结束之后打印什么。


例如,如果你想在你打印之后额外空几行出来,就改一下“end”的值就会产生新行:

但是,反过来讲如果你不想在输出之后加新行,吧“end”的值设成空字符串就可以了:

注意,在python交互命令行中,使用空字符串打印内容意味着下一个“>>>”提示出现在所打印内容之后。毕竟,您并没有要求在您所写的内容之后有一个新行,而python遵从了您的请求。


当然,你可以传递根本不涉及换行的“end”值。例如,假设您希望将多个字段输出到屏幕,每个字段打印在一行中:

默认情况下,“print”将其数据发送到标准输出,在python中称为“sys.stdout”。当“sys”模块与python一起自动加载时,它的名称不可用,除非你明确了“import sys”。


“print”函数允许您使用“file”参数指定要写入的另一个类似文件的对象(即,遵循适当协议的对象)。对象必须是可写的,除此之外,您可以使用任何对象。
例如:

在这种情况下,输出被写入一个文件。但我们也可以写入一个Stringio对象,例如,它的行为类似于一个文件,但不是一个文件。


注意,如果我在上面的示例中没有关闭“f”,输出就不会到达文件中。这是因为默认情况下,python会缓冲所有输出;每当写入文件时,只有当缓冲区填满(并刷新)时,显式调用“flush”方法时,或关闭文件时(从而隐式刷新)才实际写入数据。将“with”结构与文件对象一起使用就会关闭它,从而刷新缓冲区。


但是,还有另一种刷新输出缓冲区的方法:我们可以将一个True值传递给“print”中的“flush”参数。在这种情况下,输出会立即刷新到磁盘,然后写入。这听起来不错,但请记住,缓冲的目的是减少磁盘和计算机I/O系统上的负载。所以需要的时候才能刷新,但不要一直这样做——除非你是按小时付钱的,而且更慢些对你有好处。


下面是一个有或无冲洗的打印示例:

您可能注意到这里有一个小的不一致:“print”写入文件,默认情况下为“sys.stdout”。如果我们不刷新或关闭文件,输出将被缓冲。那么,当我们打印到屏幕上时,为什么不需要冲洗(或者关闭,这不是一个好主意)?


答案是“sys.stdout”是由python专门处理的。正如python文档所说,它是“行缓冲的”,这意味着每次发送换行符(“\n”)时,都会刷新输出。只要你把东西打印到“sys.stdout”就会以新行结尾——为什么不这样做呢?——你不会注意到缓存。

还记得Python2吗?


在我写这篇文章的时候,是2019年1月,距离不再支持或维护python 2之前还有不到12个月的时间。这并没有改变我的许多客户仍在使用python 2的事实(因为重写大型代码库既不可行也不值得)。如果您仍在使用python 2,那么应该尝试转移到python 3。


事实上,让用户从python 2到3的因素之一就是“打印”的不同。


首先,python2中的“print”是一个语句,而不是表达式。这意味着2中的括号是可选的,而3中的括号是强制的——当人们从2移动到3时,首先要学习的内容之一。


这也意味着在python2中“print”不能传递给其他函数。在Python3中是可以的。


python 2的“print”语句没有可以处理的参数(或默认值)。你想打印到文件而不是“sys.stdout”?将其分配给“sys.stdout”以使用“print”——或者只使用文件的“write”方法写入文件。你想让“打印”在打印后降行?在行尾加一个逗号。(是的,这是真的;这很难看,但是管用。)


如果您正在使用python 2,并且想体验一下python 3的打印功能,那该怎么办?您可以将此行添加到代码中:

from __future__ import print_function

一旦您这样做了,python 3的“print”函数就会就位。
现在我知道python 3已经不是将来时了;实际上,您可以说python 2已经过时了。但对于许多想转型或学习如何转型的人来说,这是一个很好的方法。但是要当心:如果您有不带括号的“打印”调用,或者是避免行换行的逗号,那么您需要做的不仅仅是这个导入。您需要检查您的代码,并确保它以这种方式工作。所以这看起来是一个明智的方法,是一个大的过渡阶段你需要做的第一步,从2到3。



英文原文:https://blog.lerner.co.il/beyond-the-hello-world-of-pythons-print-function/
译者:游骑兵



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6qWZ6otN5x
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28357