一、print 函数
1、打印字符串
print 函数可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:
>>> print('The quick brown fox', 'jumps over', 'the lazy dog')
The quick brown fox jumps over the lazy dog
print() 会依次打印每个字符串,遇到逗号“,”会输出一个空格。
print 函数的原型:
print(self, *args, sep=' ', end='\n', file=None)
sep 参数: 分隔的符号,默认是一个空格;
end 参数: 打印后的结束方式,默认为换行符 \n。
如果,设置 end=‘’,则可以不换行,让 print 在一行内连续打印。
2、打印数或计算结果:
>>> print(100 + 200)
因此,我们可以把计算100 + 200的结果打印得更漂亮一点:
>>> print('100 + 200 =', 100 + 200)
二、print 格式化输出
% 运算符
格式化字符串,它相当于一个字符串模板,可以放置一些转换说明符(占位符)。
字符串格式
% [( name )][ flag ][ width ][ . ][ precision ] type
name:可为空,数字(占位),命名(传递参数名,不能以数字开头)以字典格式映射格式化,其为键名;
flag:标记格式限定符号,包含+-#和0,+表示右对齐(会显示正负号),-左对齐,前面默认为填充空格(即默认右对齐),0表示填充0,#表示八进制时前面补充0,16进制数填充0x,二进制填充0b;
width:宽度(最短长度,包含小数点,小于width时会填充);
precision:小数点后的位数;
type:输入格式类型。
>>> print("我叫 %s " % '王凯')
>>> print("我叫 %s 今年 %d 岁!" % ('王凯', 18))
# >>> print("我叫 %s 今年 %d 岁! python 得分 %d" % ('王凯', 18))
>>> name = '王凯'
>>> age = 18
>>> s = "我叫 %s 今年 %d 岁!" # 构造一字符串,将其中可变的部分用变量或值替代。
>>> print(s % (name, age)) # 输出格式可以固定下来,只要改变 name 和 age 就可以了。
python 转换说明符:
%s 格式化字符串
%d 格式化整数
%f 格式化浮点数字,默认保留小数点后面六位有效数字。
%c 格式化字符及其ASCII码
1、指定最小输出宽度
当数据的实际宽度小于指定宽度时,会在左侧以空格补齐;当数据的实际宽度大于指定宽度时,会按照数据的实际宽度输出。
>>> n = 1234567
>>> print("n = %10d" % n)
2、指定对齐方式
默认情况下,print() 输出的数据总是右对齐的。
- 指定左对齐
+ 表示输出的数字总要带着符号;正数带+,负数带-。
0 表示宽度不足时补充 0,而不是补充空格。
说明:
- 对于整数,指定左对齐时,在右边补 0 是没有效果的,因为这样会改变整数的值。
- 对于小数,以上三个标志可以同时存在。
- 对于字符串,只能使用-标志,因为符号对于字符串没有意义,而补 0 会改变字符串的值。
3、指定小数精度
对于小数(浮点数),print() 还允许指定小数点后的数字位数,也即指定小数的输出精度。
精度值需要放在最小宽度之后,中间用点号.隔开;也可以不写最小宽度,只写精度。具体格式如下:
%m.nf
%.nf
m 表示最小宽度,n 表示输出精度。
f = 3.141592653
# 最小宽度为8,小数点后保留3位
print("%8.3f" % f)
# 最小宽度为8,小数点后保留3位,左边补0
print("%08.3f" % f)
# 最小宽度为8,小数点后保留3位,左边补0,带符号
print("%+08.3f" % f)
练习

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
三、内置函数 format
format(11123432156465798, ',') # 内置函数
name = '小明'
age = 19
'我叫{},今年{}岁。'.format(name, age) # 字符串的format 方法
一)传递参数
1、传递位置参数
print('我叫{},今年{}岁。'.format('小明', 18))
print('我爱吃{}和{}。'.format('香蕉', '苹果', '大鸭梨'))
# print('我还吃{}和{}。'.format('西红柿'))
# 注意:花括号个数可以少于位置参数的个数,反之不然。
print('身高{0},家住{1}。'.format(1.8, '铜锣湾'))
print('我爱{0}。\n她今年{1}。\n{0}也爱我。'.format('阿香', 17))
# {0} 等价于 tuple[0] 即第一个参数,所以花括号内的数字不能越界。
# print('{1}'.format('错误用法'))
2、传递关键字参数
print('我大哥是{name},今年{age}岁。'.format(name='超人', age=20))
print('我大哥是{name},今年{age}岁。'.format(age=20, name='超人'))
3、位置参数和关键字参数混合使用
print('这是一个关于{0}、{1}和{girl}的故事。'.format('小明', '阿飞', girl='阿香')) # 关键字参数必须位于位置参数之后
# print('这是一个关于{0}、{1}和{girl}的故事。'.format('小明', girl='阿香', '阿飞'))
print('这是一个关于{}、{}和{girl}的故事。'.format('小明', '阿飞', girl='阿香'))
# print('这是一个关于{}、{1}和{girl}的故事。'.format('小明', '阿飞', girl='阿香'))
# {} 和 {非负整数} 不能同时使用
二)格式说明符
[ : ][[ 填充 ] 对齐方式 ][ 正负号 ] [ # ] [ 0 ][ 宽度 ][ 分组选项 ][.精度 ][ 类型码 ]
{ [ name ][ : ][[ fill ] align ][ sign ][ # ][ 0 ][ width ][ , ][ .precision ][ type ] }
fill = <any character> # fill 填充一个字符
align = "<" | ">" | "=" | "^" # align 对齐方式,< 左对齐, > 右对齐,^ 居中对齐,默认右对齐。
sign = "+" | "-" | " " # sign 符号, +表示正号, -表示负号
width = integer # width 最小宽度,表示最少输出多少位
precision = integer # precision 小数保留位数 或 字符串选取字符的个数
type = "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" # type 输出类型,默认是 s 。
1、填充与对齐方式
填充:
只能是一个字符,默认为空格填充;如果指定填充字符,则必须要同时指定对齐方式。
对齐方式:
<:左对齐 >:右对齐 ^:居中
=:在正负号(如果有的话)和数字之间填充,该对齐选项仅对数字类型有效。它可以输出类似 +0000120 这样的字符串。
注意:
如果不给定最小宽度 width,对齐方式毫无意义。
2、最小宽度
最小宽度 width:
如果最小宽度前面有一个前导 0,意味着用 0 填充;
这等价于指定了 0= 的填充和对齐方式
3、精度
精度指定了小数点后面要展示多少位小数,对于非数字类型,精度指定了最大字段宽度。
整数类型不能指定精度
# 对于非数字类型,精度指定最大字段宽度
print('{0:.3}'.format('Python 教程'))
# 整数类型不能指定精度
print('{:.3d}'.format(666))
4、正负号
正负号选项仅对数字类型生效,取值有三种:
+ 正数前面添加正号,负数前面添加负号
- 仅在负数前面添加负号(默认行为)
空格:正数前面需要添加一个空格,以便与负数对齐
# 正负号
print('{:哈=+8.2f}'.format(3.14159))
print('{:哈=+8.2f}'.format(-3.14159))
print('{:哈=+8.2f}'.format(0))
print('{:哈=+8.2f}'.format(-0))
5、# 号 进制转换与删除进制前缀
10进行十进制,十六进制,八进制,二进制的转换:
(#:保留进制前缀)
"int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(10)
"int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(10)
对于带着进制前缀的,如"0x"“0o”“0b”,可以直接在后面加上’x’‘o’'b’进行删除:
format(0o120, 'o')
format(0xa, 'x')
format(0b1010, 'b')
6、 分组选项
分组选项的取值有两种:
逗号 ,:使用逗号对数字以千为单位进行分隔。n 类型的数字可以使用本地化的分隔符。
n 类型在本机无法使用分组选项 ,原因可能是中文没有数字分隔符
# n 类型使用本地化的分组选项 ,
# 此项报错,我怀疑是因为中文没有数字的分隔符
# print('数字:{0:,n}'.format(6666))
# 使用 d 类型确实是可以的
print('数字:{0:,d}'.format(6666))
下划线 _:使用下划线对浮点数和 d 类型的整数以千为单位进行分隔。对于 b、o、x 和 X 类型,每四位插入一个下划线,其他类型都会报错。
# 分组选项 _ 作用于 b 类型
print('数字:{0:_b}'.format(0b100111011))
# 分组选项 _ 作用于 o 类型
print('数字:{0:_o}'.format(0o426754316))
# 分组选项 _ 作用于 x 类型
print('数字:{0:_x}'.format(0x2a846e98d))
# 分组选项 _ 作用于 X 类型
print('数字:{0:_X}'.format(0X2a846e98d))
# 分组选项 _ 作用于其他类型(比如 n 类型)
# print('字符串:{0:_n}'.format(1234567))
7、类型码
类型码可以分为三大类:
字符串类型
整数类型
浮点数类型
8、格式说明符本身可以是一个字段名,比如:
print('{0:{1}}'.format(3.14159, '.4f'))
print('{:.{}f}'.format(3.14159, 4))
练习
输出下列图形
四、f-string
1、f-string 在前缀 f 的字符串中向 {} 内直接填入要嵌入的值、变量或表达式:
print(f'1+1 = {2}')
a = 7
b = 5
print(f'{a + b = }')
2、多行 f-string
通过最外层包裹小括号,可以像下面这样非常灵活地撰写多行 f-string:
a, b, c = 1, 2, 3
s = (
f'{a = }\n'
f'{b = }\n'
f'{c = }\n'
)
print(s)
3、控制浮点数精度
在 f-string 中可以按照下列方式灵活地控制浮点数的小数位数:
import math
pi = math.pi
print(f'{pi:.3f}')
print(f'{pi:.8f}')
4、进制转换输出
在 f-string 中,可以直接在输出时将目标转换成不同的进制进行输出:
number_10 = 1024
print(f'{number_10:b}') # 2 进制
print(f'{number_10:o}') # 8 进制
print(f'{number_10:x}') # 16进制小写
print(f'{number_10:X}') # 16进制大写
print(f'{number_10:c}') # ASCII编码
5、字符串对齐
f-string 默认为右对齐,可以修改对齐方式:
text = 'python'
print(f'{text:>10}') # 右对齐
print(f'{text:<10}') # 左对齐
print(f'{text:^10}') # 居中对齐
print(f'{text:*^10}') # 居中对齐,用*补齐空白
n = 10
print(f'{text:#^{n}}') # 参数嵌套,居中对齐,用#补齐空白
6、标准化显示宽度
当需要对 f-string 打印内容的显示最小宽度进行限制时,譬如打印出类似表格的结构,可以这样写:
for x in range(1,11):
print(f'{x:02}|{x**2:3}/{x**5:6}')
7、格式化日期
针对日期类型的变量,可以参考下面的方式,直接在 f-string 中快速地进行格式化:
import datetime
now = datetime.datetime.now()
print(f'{now:%Y年%m月%d号%H点%M分%S秒}')
8、科学计数
可以实现指定位数的科学计数法显示方式:
import math
pi = math.pi
print(f'{pi*100:.10e}')
9、控制有效数字位数
还可以控制所显示数字的有效数字位数,即从左开始第一个不为0的数字往右一共显示的个数,当位数低于整数部分时会自动变成科学计数法格式:
a = 1312.3123123123123
print(f'{a:.10g}')
print(f'{a:.3g}')