Python 远古方法 % 占位符详解
前言
% 占位符方法 为字符串格式化方法之一,欲要了解更多请移步总集篇 Python 字符串格式化最强详解2.0 『如何输出好看的内容』
远古时期 % 占位符方法🙉
%占位符方法 在 Python 的 远古时期 就已经存在了,这是最古老的方法,在一些使用老版本 Python 的项目工程上多多少少还能见到这种方法,但这种方法较新式方法来说并不怎么好用
为什么说 占位符 方法不好用,用过的人都知道,它写起来相较其他字符串格式化方法会更麻烦,里面涉及到很多的数据类型判断🙄
如果需要 传入进去的内容是属于字符串类型的,那么在字符串格式化里的 填充位置 写的是
%s
,但如果输入的不是字符串类型,比如整数类型,那就得变成%d
官方手册对此是这么描述占位符方法的
注解 此处介绍的格式化操作具有多种怪异特性,可能导致许多常见错误(例如无法正确显示元组和字典)。 使用较新的 格式化字符串字面值,str.format() 接口或 模板字符串 有助于避免这样的错误。 这些替代方案中的每一种都更好地权衡并提供了简单、灵活以及可扩展性优势。
(一)、转换说明符
转换说明符 | 书写格式 | 描述 |
---|---|---|
"s" | "%s" | 字符串格式 |
"c" | "%c" | 将整数转换成相应的 unicode[^1] 字符 |
"o" | "%o" | 八进制格式 |
"d" | "%d" | 十进制整数格式 |
"x" | "%x" | 十六进制格式,使用小写字母表示 9 以上的数码 |
"X" | "%X" | 十六进制格式,使用大写字母表示 9 以上的数码 |
"f" | "%f" | 浮点数格式,精确到小数点后六位 |
"%%" | "%%" | 字符 “%” 本身 |
1) 先拿刚刚提到的 %s
和 %d
做例子🍖
张三今天去买彩票,非常幸运的中了 2333 块钱 ,在 Python 中如果打印这句话那就是这么写 print("张三今天去买彩票,非常幸运的中了 2333 块钱")
这里我们打印的是字符串,且已经知道了张三中了多少钱,但如果我们并不知道张三中了多少钱,需要后期告知的情况下,才能将这句话给打印出来,对于这种问题,可以使用字符串格式化解决,那么怎么去写呢(占位符方法)?🤔
money = "23333"
print("张三今天去买彩票,非常幸运的中了 %s 块钱" % money)
上述代码中,成功使用了占位符方法,将 张三的中奖金额 给传了进去
可能有读者要问了,不是说 %s
是传入字符串格式吗,怎么能把整数给传进去,注意看,这里的money
变量是字符串格式,23333 左右有引号
那如果 money=233333
是整数格式呢又要怎么传进去呢,很简单,把 %s
改成 %d
即可 「注意把23333的双引号去掉」
money = 23333
print("张三今天去买彩票,非常幸运的中了 %d 块钱" % money)
2) 如果要传入多个参数又要怎么做
张三星期六那天去买彩票,非常幸运的中了6 块钱,这里需要传入两个不同的值,分别是 星期六 和 6
money = "6"
date = "星期六"
print("张三%s那天去买彩票,非常幸运的中了%s块钱" % (date, money))
观察上面的代码,可以发现分别在需要格式化的地方使用了 %s
占位符,并且在最后面传入参数的地方使用了一个元组,将数值圈了起来,并且顺序是从左往右,跟占位符的位置一 一对应
那如果是不同字符串表示类型的占位符那该怎么做,还是很简单,把 %s
改成 %d
即可,但要注意,要根据占位符的位置一 一把需要传入的参数对应上,否则会照成字符串类型的参数被 %d
所表示,会直接报错「注意把6的双引号去掉」
money = 6
date = "星期六"
print("张三%s那天去买彩票,非常幸运的中了%d块钱" % (date, money))
3) 看完上述内容,其实其他字符串表示类型使用起来也是大同小异,让我们看看示例🍗
-
%c
是将整数转成对应的 Unicode 字符,这里打印 你好世界 在 Unicode 中的对应位置print("%c%c%c%c" % (20320, 22909, 19990, 30028))
-
%o
输出八进制,逢八进一print("%o" % 8)
-
%x
输出十六进制,逢十六进一,用小写表示十六进制print("%x" % 0xf) # 输出f
-
%X
输出十六进制,逢十六进一,用大写表示十六进制print("%X" % 0xf) # 输出F
-
%f
输出浮点数,精确到小数点后六位,超过的话按五舍六入原则进一print("%f" % 56.5666666) # 输出56.566667
-
%%
输出 % 本身print("%%" % ())
占位符方法逐渐 被 新式字符串格式化方法所取代,关于新式方法下面会有提到
(二)、占位符 方法的功能
1) 指定显示宽度
除了上述提到最基本的说明符类型,字符串格式化 占位符方法 还有其他功能,比如这个指定显示宽度
观察下面的代码
x = 123456
print("指定长度10:%10d" % x)
print("指定长度5:%5d" % x)
指定长度10: 123456
指定长度5:123456
可以看到 x
的宽度为六,当指定宽度为十时,会用空格填补剩余的四个宽度,并且右对齐
细心的可能注意到了一点,明明x
的宽度为六,可指定宽度为五时也能全部打印,这是因为当数据的实际宽度大于所指定宽度时,会按照实际的宽度打输出
2) 指定对齐方式
符号 | 描述 |
---|---|
- | 左对齐,并不是变数值变负 |
+ | 表示输出的数值带符号,带的符号根据数值正负决定 |
0 | 表示宽度不足时用0代替空格填报剩余宽度 |
# | 对于换算进制的转换说明符,会在开头显示进制前缀 |
+、- 符号
x = 123456
print("%+d" % x)
print("左对齐并指定长度10:%-10d" % x)
print("带符号显示并指定长度10:%+10d" % x)
print("带符号显示并指定长度10:%-10d" % x)
+123456
左对齐并指定长度10:123456
带符号显示并指定长度10: +123456
带符号显示并指定长度10:123456
0、# 符号
x = 123456
print("指定长度10:%010d" % x)
print("指定长度5:%05d" % x)
print("指定长度10并左对齐:%#-10x" % 31)
指定长度10:0000123456
指定长度5:123456
指定长度10:0x1f
结合上面的表去看代码
3) 指定小数精度
先想个问题?什么数字类型是整数部分和小数形式组成
浮点数! 那要用到的说明符因是 %f
f = 2.33333
print("精确到小数点后三位:%.3f" % f)
精确到小数点后三位:2.333
那如果传入整数类型呢?可以看到如果是没有小数点的整数,会转化成浮点数并保留小数点后三位
f = 2
print("精确到小数点后三位:%.3f" % f)
精确到小数点后三位:2.000
上面的这些是精确到后三位 %.3f
,如果要精确到后两位 => %.2f
讲了这么多,那如果不保留小数要怎么做呢? 先想想
其实很简单,可以想到的是:
- 保留小数点后0位
- 以整数形式表示
f = 2.33333
print("不保留小数:%.0f" % f)
print("不保留小数:%d" % f)
不保留小数:2
不保留小数:2
这里使用的均是向下取整,详情请参考 Python 关于浮点数取整详解
(三)、书写格式和优先顺序👺
占位符方法的书写格式如下: 👇
“%(映射键)[符号][宽度][.精度][转换类型]” % ...
-
映射键: 在上面的示例中,传单个值不加括号,传多个值时把值放进括号里,但其实还能有键值对的传值方式👇🏻
print("张三%(date)s那天去买彩票,非常幸运的中了%(money)d块钱" % {"date": "星期六", "money": 2333})
-
符号: 参考 2) 指定对齐方式
-
宽度: 参考 1) 指定显示宽度
-
.精度: 参考 3) 指定小数精度
-
转换类型: 参考 (一)、转换说明符
好了,关于字符串格式化 占位符方法 就讲到这了,相信你已经学会了