先把源码贴上:
# 根据指定宽度打印格式良好的价格列表 width = int(input(‘Please enter width‘)) price_width = 10 item_width = width - price_width header_fmt = ‘{{:{}}}{{:>{}}}‘.format(item_width, price_width) fmt = ‘{{:{}}}{{:>{}.2f}}‘.format(item_width, price_width) print(‘=‘ * width) print(header_fmt.format(‘Item‘, ‘Price‘)) print(‘-‘ * width) print(fmt.format(‘Apple‘, 0.4)) print(fmt.format(‘Pears‘, 0.5)) print(fmt.format(‘Cantaloupes‘, 1.92)) print(fmt.format(‘Dried Apricots(16 oz.)‘, 8)) print(fmt.format(‘Prunes (4 lbs.)‘, 12)) print(‘=‘ * width)
整段代码也比较简单,可是每次看第八九行时就头大,一堆{}完全看不懂,如有伙伴对本例其他地方有疑问,可以仔细读下当前章节的内容,还是很好理解的。今天研究了一上午,也没搜到太多有用的信息,于是自己写dome测试,略微知道了一点,就赶紧记下(纯属个人理解,如有雷同,不甚荣幸,如是错误,深表遗憾)。
那我们开始分析一下:
首先有两句话,我先放这里:
第一句:“我分两次设置了字符串的格式” (这是书中例子上方作者解释的时候的一句话)。
第二句:“格式定义字符串本身又包括占位符,两层花括号变成花括号,一对花括号变成宽度数值”(贴吧中某位不愿透露姓名的热心网友甲)。
然后来看两个简单的格式化:
print(‘{:>{}}‘.format(‘name‘, 10)) # 输出为: name # 为了清除的显示出字符串占了10个字符,我这里设置了右对齐
这个应该容易理解,name对应占位符,而10对应宽度值。
那我们再来看一个:
print(‘{{:{}}}‘.format(10)) 输出为: {:10}
咦~
这个结果有点怪(怪可爱的>_<),我的“一大堆”花括号怎么就剩一对了?
我们需要借助第二句话来理解一下——“格式定义字符串本身又包括占位符”,什么意思呢?还是看个小例子:
h = ‘{:.3}‘ print(h.format(‘hello‘)) 输出为: hel
例子中的h就是“格式定义字符串”,h中含有占位符{},即:格式定义字符串本身又包括占位符,当字符串被格式化完毕以后,就不用再占什么位置了,自然就不需要占位符{},所以输出结果是 hel ,而不是 {hel} 。
同理,我们回到上一个例子,当 {{:{}}} 被格式化完毕输出时,最外层的占位符,自然就消失了,变成 {:{}} ,而最内层的占位符,又有宽度值10替换,所以结果就是 {:10} 。这时我们还可以在格式化一次,得到一个看起来比较正常的结果,改进一下:
tra = ‘{{:>{}}}‘.format(10) res = tra.format(‘result‘) print(res) 输出为: result # 同样是右对齐
这时我们再来回看书中的例子就很容易理解了(我这里把item_width和price_width拆开了,只要理解一个就行了):
# 注:这里令item_width = 10 item_width = 10 header_fmt = ‘{{:{}}}‘.format(item_width) print(header_fmt.format(‘Item‘)) 输出: Item # 使用的左对齐,有些字符看不出来
所以就是这样了。
等等~
你莫不是忘了还有一句话没解释吧!
差点忘了,不过问题都解决了,怎么多处一句话来(手动尴尬),看来不牛逼就不要在开始的时候装逼>_<,不过话都说了,我也得圆回来不是。
其实就是作者的这么一句话“我分两次设置了字符串的格式”,才导致问题复杂了那么一点点,于是,像我(本人)这种脑子不太灵光的没转过来弯,为什么这么说,还是得上代码:
# 注:这里令item_width = 10 item_width = 10 # 格式化两次 header_fmt = ‘{{:{}}}‘.format(item_width) print(header_fmt.format(‘Item‘)) # 格式化一次 print(‘{:{}}‘.format(‘Item‘, item_width)) 两种情况输出结果相同: Item # 使用的左对齐,有些字符看不出来
看完要哭了有木有,格式化一次这么简单,也没有“一大推”的花括号,一看就能理解,作者明显跟我赵日天过不去呀!为什么不写成格式化一次?
为什么呢?自己研究喽!
原文地址:https://www.cnblogs.com/eric5723/p/11268799.html