关于《python基础教程》字符串章节例子的多个花括号问题

先把源码贴上:

# 根据指定宽度打印格式良好的价格列表

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/lymlike/p/11268799.html