转载 为什么print在Python 3中变成了函数?

转载自编程派http://codingpy.com/article/why-print-became-a-function-in-python-3/

原作者:Brett Cannon

原文链接:http://www.snarky.ca/why-print-became-a-function-in-python-3

译者:[email protected]编程派

在Python 2中,print是一个语句(statement);而在Python 3中变成了函数(function)。很多Python用户都会问,为什么Python 3将print变成了函数呢?本文就是Python核心开发者Brett Cannon对此的解释。

今年初Python决定迁移到Github,就是由Brett Cannon征求Python社区的意见后作出的。他对此也作出了解释。

print语句与print函数的区别

print语句

在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‘)。

print函数

如果用Python来实现print函数,它的函数定义应该是这样的:

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语句的所有特性。

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变成函数的原因。

原文地址:https://www.cnblogs.com/saolv/p/8436266.html

时间: 2024-11-07 09:59:40

转载 为什么print在Python 3中变成了函数?的相关文章

python列表中的pop函数

再python的列表中,有许多的内置方法,而在这里我主要向大家介绍一下pop函数. pop函数主要是用于删除列表中的数据.而其删除值时会返回删除的值.如果没有参数传入时, 则会默认认为删除列表的最后一项数据. 如: a = ["ss",'nn','cc'] print(a.pop(1))运行结果就是nn如果是print(a.pop())运行结果就是:cc 原文地址:https://www.cnblogs.com/bao9687426/p/9813041.html

Python编程中自定义Lambda函数的使用场景

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数. Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个

python编程中的闭包函数

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体. 看概念总是让人摸不着头脑,看几个python小例子就会了 例1 def make_adder(addend):     def adder(augend):      

python 类中的某个函数作为装饰器

在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return wrapped @ wrapper ###装饰mix def mix(): ... 当调用mix的时候,self.mix() ,会将self等参数传入 wrapper 中来吗?答案为否. 当wrapper作为装饰器的并且@wrapper这种方式作为装饰的时候,wrapper就跟普通的函数一样,仅仅

python之类中的super函数

作用 实现代码重用 思考:super真的只是调用父类么? super函数是按照mro算法去调用的,不bb上代码: class A: def __init__(self): print('A') class B(A): def __init__(self): print('B') super().__init__() class C(A): def __init__(self): print('C') super().__init__() class D(B, C): def __init__(s

Python学习过程中各个难点---函数篇

对于函数,我一直分不清局部变量与全局变量,今天又好好研究了下,终于搞清楚了. 例子: 其次对于global这个关键字我也是一知半解的状态,之前整个人都是懵懵的,现在搞明白了 匿名函数: 匿名函数使用关键词lambda定义,初看普通,但是配合其他函数使用,还是很牛的,配合例子看 递归函数我也不太了解: 递归函数: 简而言之,就是函数在其内部调用自己本身,这种函数就叫做递归函数,一样,我写了例子: 原文地址:https://www.cnblogs.com/roy1235/p/9696731.html

为什么print在python3中变成了函数?

转自:http://www.codingpy.com/article/why-print-became-a-function-in-python-3/ 在Python 2中,print是一个语句(statement):而在Python 3中变成了函数(function).很多Python用户都会问,为什么Python 3将print变成了函数呢?本文就是Python核心开发者Brett Cannon对此的解释. 今年初Python决定迁移到Github,就是由Brett Cannon征求Pyth

python语句中的 end=' ' 的作用

为末尾end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串,其实这也是一个语法要求,表示这个语句没结束. print默认是打印一行,结尾加换行.end=' '意思是末尾不换行,加空格 如下所示:使用for循环实现九九乘法表:(使用 end=' ') 梯度展示打印一行,结尾加换行 for i in range(1, 10): for j in range(1, i + 1): print('{}x{}={}\t'.format(j, i, i * j),

Effective Python 小笔记之 zip 函数

环境:Python 3.5.1 CentOS 7 zip函数可以同时遍历两个迭代器. 在编写Python代码时,通常要面对很多列表,而这些列表中的对象,可能是相互关联的.如下例:     names = ['Cecilia', 'Lily', 'Maria']     length = [len(word) for word in names] 对于上例中的源列表和派生列表,相同索引处有关联关系,以此再引申出一个例子:     longest_name = None     max_length