字符串格式化
Python的字符串格式化有两种方式
- %格式符方式
- format方式
事实上,格式化借助的是对象的魔术方法。
实现了__format__
的对象才适用于format方式格式化输出,
实现了__str__
,__repe__
的对象才分别适用于格式符%s
和%r
输出。
%
格式符
一般格式为 %(name)
+ format_spec
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
name
可选,用于选择指定的key
>>> "%(name)s——%(age)d"%{'name':'宝钟玛琳','age':17}
'宝钟玛琳——17'
s 和 d 属于 [type
]
format_spec规则的常用组分:
sign
可选,数字和字符串可供选择的值有:
-
+
右对齐;正数负数前加正负号 -
-
左对齐;负数前加负号 - 空格 右对齐;负数前加负号
-
0
右对齐;正数前无符号,负数前加负号;用0填充空白处
width
可选,占有宽度
>>> "%(name)+7s——%(age)-5d"%{'name':'宝钟玛琳','age':17}
' 宝钟玛琳——17 '
.precision
可选,小数点后保留的位数 默认6位
type
类型,必选
任意对象:
-
%s
字符串 (采用str()
的显示) -
%r
字符串 (采用repr()
的显示) -
%c
单个字符
字符串和整数:
-
%b
二进制整数 -
%%
字符"%"转义
数字:
-
%d
十进制整数 -
%i
十进制整数 -
%o
八进制整数 -
%x
十六进制整数 -
%e
指数 (基底写为e) -
%E
指数 (基底写为E) -
%f
浮点数 -
%F
浮点数,与上相同 -
%g
科学计数法(e)或浮点数 (根据显示长度) -
%G
科学计数法(E)或浮点数 (根据显示长度) -
%%
字符"%"
>>> '——%(p).2f'%{'p':0.1+0.2}
'——0.30'
>>> '——%(p).2g'%{'p':0.1+0.2}
'——0.3'
终端字体颜色
"""
#格式:
设置颜色开始 :\033[显示方式;前景色;背景色m
#说明:
前景色 背景色 颜色
---------------------------------------
30 40 黑色
31 41 红色
32 42 绿色
33 43 黃色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
显示方式 意义
-------------------------
0 终端默认设置
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示
8 不可见
"""
#例子:
\033[1;31;40m #1-高亮显示 31-前景色红色 40-背景色黑色
\033[0m #采用终端默认设置,即取消颜色设置
可以使用第三方模块termcolor来简化语句:
from termcolor import colored
print(colored("helloworld", "red"))
第三方模块在使用前需要用pip安装
系统支持
Windows7及以下无法解析颜色代码
使用termcolor模块也无效
可以使用第三方模块colorama来显示颜色
colorama模块兼容更好:
from colorama import init, Fore
init(autoreset=False) #给True的时候print时无需+Fore.RESET
print(Fore.RED + "helloworld" + Fore.RESET)
内置函数format()
内置函数format
(value[, format_spec])
第二个参数即format_spec格式规格迷你语言
实现了魔术方法__format__
的对象都可以使用
以数字对象的格式化为例:
>>> format(12,'+.3f') #保留3位小数
'+12.000'
>>> format(3,'b') #二进制转化
'11'
其他实现了魔术方法__format__
的对象,这里以datetime.time
对象为例:
>>> night = datetime.time(22,30,tzinfo=datetime.timezone(
... datetime.timedelta(hours=8), name = '北京'))
>>> format(night,'现在是%Z时间%H点%M分')
'现在是北京时间22点30分'
str.format()
' {} {} {} '.format(a,b,c)
' {0} {1} {2} '.format(a,b,c)
' {0} {1} {2} '.format(*[a,b,c])
' {a} {b} {c} '.format(a=a,b=b,c=c)
' {a} {b} {c} '.format(**{"a":a,"b":b,"c":c})
{!s}
是默认的
'{!s}、{!a}、{!r}' #分别表示str、ascii和repr方法。
实现了魔术方法__format__
的对象可以使用冒号 : format_spec
>>> '0x{:x}'.format(255)
'0xff'
以datetime.time
对象为例的其他实现了魔术方法__format__
的对象:
>>> '现在是{:%Z}时间{:%H}点{:%M}分'.format(night,night,night)
'现在是北京时间22点30分'
f字符串
在python3.6以上,str.format()
可以直接使用f字符串的写法
用f'{a}{b}{c}'
即可代替'{a}{b}{c}'.format(a=a,b=b,c=c)
。
f字符串中不允许使用\
转义字符。
以datetime.time
对象为例的其他实现了魔术方法__format__
的对象:
>>> f'现在是{night:%Z}时间{night:%H}点{night:%M}分'
'现在是北京时间22点30分'
在python3.8以上
f字符串中可以直接使用说明符=
调试,
>>> python = 3.8
>>> f"{python=}"
'python=3.8'
内置函数str()
和repr()
str()
不止是构造函数(class
)实例化一个str
对象,
str(o)
它也是对参数对象进行魔术方法的调用:o.__str__()
,将参数转换为了str
对象
无论是print(o)
,f'{o}'
, "%s"%o
,它们都是对魔术方法 o.__str__()
的调用
而repr(o)
,f'{o!r}'
, "%r"%o
则是对魔术方法 o.__repr__()
的调用,
它会以字面量的形式呈现对象,即字符串带有引号,列表变成'['+ repr(成员) + ',]'
f字符串中f'{o=}'
就相当于f'o={repr(o)}'
网友评论