Python版本:3.8.8
引入
>>> print("Hello World")
Hello World
这是我们初学者写的第一个Python程序,这个程序的主体由一个函数组成,这个函数的函数名是print(打印),顾名思义,这个函数的作用将程序运行的结果以字符串输出,让用户/其他程序可见可读。本文将就print()函数进行系统解说
一、print()函数详解
首先,我们来看看Python自己是怎么解释print()函数的,在IDLE中输入
>>> help(print)
Python会给出如下反馈
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
这段文字给了我们print()函数的一些基本信息:
built-in function print in module builtins
表示print()是Python的69个内置函数之一,也就是说,使用print()函数不需要导入任何模块print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
展示了print()函数运行所需要的全部5个参数:value
、sep
、end
、file
、flush
,其中value
参数是你要输出的值,可以是数字,字符串,列表,元组或者字典,多个value之间用逗号分隔>>> outnum=1 >>> print(outnum) 1 >>> outstr="Hello World" >>> print(outstr) Hello World >>> outlis=[1,2,3,4,5] >>> print(outlis) [1, 2, 3, 4, 5] >>> outtup=(5,10) >>> print(outtup) (5, 10) >>> outdic={"Chinese":90,"Math":80} >>> print(outdic) {'Chinese': 90, 'Math': 80} >>> print(outnum,outstr,outlis,outtup,outdic) 1 Hello World [1, 2, 3, 4, 5] (5, 10) {'Chinese': 90, 'Math': 80}
sep
是separation(间隔)的缩写,这个参数控制在两个value之间输出的内容
比较下面代码的输出:
可以看到第一次输出的1和2之间有一个空格,第二次输出的1和2之间不再有空格,取而代之的是一个加号。这是由于参数sep在你调用print()函数时>>> print(1,2) 1 2 >>> print(1,2,sep="+") 1+2
default a space
(默认为空格),也就是说,当你没有为sep参数指定值时,Python默认给sep赋值为一个空格,即
是以>>> print(1,2)
被Python执行的>>> print(1,2,sep=' ')
end
(结尾)参数控制print()函数结尾输出的内容
同样比较下面代码的输出
和第一次的输出相比,第二次输出的1和2并不在两行,而在一行中以加号分隔。与sep相似,参数end在你调用print()函数时print(1) print(2) ''' 运行结果如下: 1 2 ''' print(1,end="+") print(2) ''' 运行结果如下: 1+2 '''
default a newline
(默认为换行),也就是说,当你没有为end参数指定值时,Python默认给end赋值为一个换行符,即
是以>>> print("Hello World")
被Python执行的>>> print("Hello World",end='\n')
file
(文件)参数控制print()函数的输出目标,这个参数在你调用print()函数时defaults to the current sys.stdout
(默认系统标准输出流,也就是输出到我们常说的控制台(console)),在你需要的时候,通过给file赋值,可以将程序运行的结果输出到指定的文件中flush
(刷新)参数控制print()函数输出过程中的缓冲区的刷新状态,默认为False,即不强制刷新缓冲区。简单来说,在你调用print()函数时,输出的字符串首先写入内存缓冲区,再从缓冲区写入文件,同时刷新缓冲区
运行如下代码:
会发现每隔一秒,200个import time for i in range(10): for j in range(200): print(".",end="") print() time.sleep(1)
.
会一次性出现在屏幕上
如果将flush设置为True,强制刷新缓冲区:
再次运行,每隔1秒,200个import time for i in range(10): for j in range(200): print(".",end="",flush=True) print() time.sleep(1)
.
会陆续出现在屏幕上,这说明输出的字符不再于缓冲区内等待,而是直接输出到控制台
同理,flush可以将数据即时写入文件,而不是等到close()后一并写入文件
综上所述,我们眼里的print()函数时这样的:
print("Hello","World")
而Python眼里的print()函数是这样的:
print("Hello","World",sep=' ',end='\n',file=sys.stdout,flush=False)
- 通过熟练运用这些“不为人知”的参数,我们可以应对更加复杂的输出
注:
- 调用print()时必须先赋没有默认值的value参数,然后才能是其他有默认值的参数,对于有默认值的参数,其先后顺序没有要求,这和正常Python函数的调用一致
# right print("Hello World",end="!",flush=False) print("Hello World",flush=False,end="!") # wrong print(end="!","Hello World",flush=False)
- 虽然file的默认参数是
sys.stdout
而print()本身并不需要导入模块,但是如果我们真的在程序中使用了sys.stdout
,需要导入sys
模块# wrong print("Hello World",file=sys.stdout) # right import sys print("Hello World",file=sys.stdout)
二、print()的格式化输出
有的时候,单纯地把value用print()输出并不能满足我们的需要,比如以下几个例子:
# 输出变量数量多,种类复杂
print("My name is",name+".","I'm",age,"years old.","My major is",major+".")
# 浮点数保留小数位数
print(round(valf,6))
# 以二进制输出整数
while(vali):
ans+=str(vali%2)
vali//=2
print(ans[::-1])
为了解决这类问题,print()为我们提供了格式化输出的功能,下面是实现格式化输出的几种方法
2.1 格式控制符
Python继承了很多C语言的特性,格式控制符便是其中之一,Python可以通过格式控制符和转换说明符来进行格式化输出,如上例用格式控制符写为
print("My name is %s. I'm %d years old. My major is %s."%(name,age,major))
可以看到,原本很多个value组成的复杂表达式变成了一个字符串,所有的变量被放在了最后,这些变量原本所在的位置被 %+字母 代替了,这就是格式控制符,而变量所在的元组叫做转换说明符,两者之间用 % 连接。变量与格式控制符之间的对应关系如下表
格式控制符 | 说明 | 格式控制符 | 说明 |
---|---|---|---|
%d / %i | 十进制整数(dec) | %r | 字符串以repr()显示 |
%b | 二进制整数(bin) | %c | 单个字符(char)及其ASCII码 |
%o | 八进制整数(oct) | %f / %F | 浮点数 |
%x / %X | 十六进制整数(hex),区分大小写 | %e / %E | 科学计数法 ,区分大小写 |
%s | 字符串以str()显示 | %g / %G | 自动匹配 十进制整数/浮点数/科学计数法 |
仅供学习参考,如有不足之处,敬请批评指正