print输出函数用法及原理总结:
print语句输出,例如,x=5 ; print x ,但在python3.x中,print则成为了一个函数,输出用print()函数输出,例如:x=5 ; print(x) ,(python2.x中,print作为作为关键字用语句输出,可以加或不加小括号,但python3.x中作为函数必须加小括号。)
一:print函数的用法总结
1:直接输出
无论是在python2.x中还是在python3.x中,对于字符串,数值,布尔,列表,字典等,print都是直接输出
-print(变量/字符串)
2:格式化输出
print()支持参数格式化输出,与C语言中用法类似、
字符串格式化转换类型
转换类型 含义
d 带符号的十进制整数
o 不带符号的八进制
u 不带符号的十进制
x或X 不带符号的十六进制
e 或E 科学计数法表示的浮点数
f,F 十进制浮点数
C 单字符(接受整数或者单字符字符串)
r 字符串(使用repr转换任意python对象)
s 字符串(使用str转换任意python对象)
1. >>> pi = 3.141592653
2. >>> print( '%10.3f' % pi) #字段宽10,精度3
3. 3.142
4. >>> print( "pi = %.*f" % ( 3,pi)) #用*从后面的元组中读取字段宽度或精度
5. pi = 3.142
6. >>> print( '%010.3f' % pi) #用0填充空白
7. 000003.142
8. >>> print( '%-10.3f' % pi) #左对齐
9. 3.142
10. >>> print( '%+f' % pi) #显示正负号
11. + 3.141593
《Python基础编程》中对格式化输出的总结:
(1). %字符:标记转换说明符的开始
(2). 转换标志:-表示左对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充
(3). 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。
(4). 点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将从元组中读出
3:print()不想自动换行的解决办法
在python2.x中,在输出内容的结尾处加上逗号 例如:print ('123',)
在python3.x中,在输出内容的结尾处加上end=' ' 例如:print ('123',end='')
二:print函数原理总结:
1:print函数的内置方法sep与end
set是单词separation的简称,即代表分隔符,默认是空格
end代表结束出的符号,默认是一个换行符
print函数输出多个用‘,’隔开的字符串时,输出的语句中,用空格代替,结尾用换行代替
>>> print ('hello','world')
hello world
2: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
变成函数的原因。