今天看到了一行这样的代码:
boundary = '%.32x' % random.randint(0, 256**16)
我知道这是一个生成格式化字符串的语句,它将随机生成的一个32位16进制数,将这个数转换为字符串赋值给boundary。这个boundary将用来标记在网络上传输的若干个数据块之间的边界。
随机数上限,25616==1632,这点很容易理解。但python的修炼还不到家,'%.32x'
这种格式化输出的方式让我稍微有些困惑。指定32,是确保生成的边界界定字符串为32位,若不指定32
,那么生成的随机数若首位或前几位为零将会被忽略掉(虽然这样的概率较小,但不可忽视),不能生成满足要求的32位界定符。
下面,将python的格式化输出小小归纳一下。
格式符
格式符为真实值预留位置,并指定其显示格式,格式符包含一个类型码(typecode),用来控制显示的类型:
类型码 | 含义 |
---|---|
%s | 字符串 (采用str()的显示) |
%r | 字符串 (采用repr()的显示) |
%c | 单个字符 |
%b | 二进制整数 |
%d | 十进制整数 |
%i | 十进制整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%e | 指数 (基底写为e) |
%E | 指数 (基底写为E) |
%f | 浮点数 |
%F | 浮点数,与上相同 |
%g | 指数(e)或浮点数 (根据显示长度) |
%G | 指数(E)或浮点数 (根据显示长度) |
%% | 字符"%" |
说明1:str()
和repr()
在特性和功能方面都比较类似,但前者对用户比较友好,适用于print输出;而后者对python本身比较亲近,能方便将其它类型转换为python可识别的字符串。(具体可参考str和repr区别)
说明2: %%
表示输出百分号%
说明3:至于%d
和%i
有何区别,任意整数和无符号整数的区别吗?好像不是。这个问题我也还没弄清楚。
高级控制
- 格式:
%[(name)][flags][width].[precision]typecode
typecode:上表中所列
name:命名
flags:可以有+,-,' '或0。+表示右对齐。-表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。
width:表示显示宽度
precision:表示小数点后精度
最后,附上一个使用name的例子:
print "Logging file path: %(path)s.\n Timestamp:%(timestampe).4f" %
{'path':'/var/log/ecsyslog', 'timestamp':time.time()}