本文首发于编程派的微信公众号。python
原做者:Brett Cannongit
原文连接:http://www.snarky.ca/why-print-became-a-function-in-python-3github
译者:EarlGrey@编程派express
在Python 2中,print是一个语句(statement);而在Python 3中变成了函数(function)。不少Python用户都会问,为何Python 3将print变成了函数呢?本文就是Python核心开发者Brett Cannon对此的解释。编程
今年初Python决定迁移到Github,就是由Brett Cannon征求Python社区的意见后做出的。他对此也做出了解释。微信
在Python 2中,print语句最简单的使用形式就是print A
,这至关于执行了sys.stdout.write(str(A) + '\n')
。若是你以逗号为分隔符,传递额外的参数(argument),这些参数会被传递至str()
函数,最终打印时每一个参数之间会空一格。例如,print A, B, C
至关于sys.stdout.write(' '.join(map(str, [A, B, C])) + '\n')
。若是print语句的最后再加上一个逗号,那么就不会再添加断行符(\n
),也就是说:print A
至关于sys.stdout.write(str(A))
。函数
从 2.0版本开始,Python引入了print >>
的语法,做用是重定向print
语句最终输出字符串的文件。例如,print >> output, A
至关于output.write(str(A) + '\n')
。组件化
若是用Python来实现print函数,它的函数定义应该是这样的:ui
import sys def print(*objects, sep=None, end=None, file=None, flush=False): """A Python translation of the C code for builtins.print().
""" if sep is None: sep = ' ' if end is None: end = '\n' if file is None: file = sys.stdout file.write(sep.join(map(str, objects)) + end) if flush: file.flush()
从上面的代码中,咱们能够发现:Python 3中的print函数实现了print语句的全部特性。spa
print A == print(A) print A, B, C == print(A, B, C) print A, == print(A, end='') print >> output, A == print(A, file=output)
从上面的示例代码中咱们就能够看出,使用print函数有明显的好处:与使用print语句相比,咱们如今可以指定其余的分隔符(separator)和结束符(end string)。
将print变成函数的真正巧妙之处在与灵活性,但这点并不容易被人发觉。print成为函数以后,给Python用户和Python开发团队带来了很大的灵活性。对于用户来讲,这可让你把print
看成表达式(expression)使用;相比之下,print语句就只能做为语句使用。举个例子,假设你想在每一行后面打印一个省略号(ellipsis),表示这行还没有结束。使用print语句的话,你有两种选择:
# 手动实现 ... print A, '...' # 可复用的实现(这种方式也适用于print函数) ... def ellipsis_print(*args): for arg in args: print arg, '', print '...'
可是在Python 3中,你能够选择更好的解决方式:
# 手动实现 ... print(A, end='...\n') # 多个可复用的解决方案,利用print语句没法实现... ellipsis_print = lambda *args, **kwargs: print(*args, **kwargs, end='...\n') # 或者 ... import functools ellipsis_print = functools.partial(print, end='...\n')
换句话说,变成函数以后,print
就能够组件化了,做为语句的print
是没法支持的。还有,你还能够编写本身喜欢的print
函数,将其赋值给builtins.print
,就能够覆盖掉自带的函数实现了。这一点在Python 2中是不可能实现的。
对于Python开发团队来讲,他们没必要再从语法层面来实现print
的相关功能了。例如,若是你想让print
语句也同样能够灵活地支持指定分隔符,你要怎样去实现呢?这会是一个至关难解决的设计难题。可是若是print变成了函数,只须要新增一个参数就解决了。在Python中,函数能够接受任意数量的参数,这比从底层实现语法带来的灵活性要大的多。
咱们还要注意,语法实现应该仅限于那些非这样作不可的功能,或者是以语法形式实现后,大幅提升了可读性的功能。在print
这个案例中,print A
与print(A)
之间的区别能够忽略不计,所以并无影响可读性。并且,因为咱们可以彻底将print
语句替换为函数,对于Python语言的功能性也没有损失。这就是为何将print
变成函数的缘由。
欢迎你们扫描下方二维码关注个人公众号“编程派”,谢谢支持!