关于《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/eric5723/p/11268799.html

时间: 2024-10-16 18:46:48

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

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '

python基础教程_学习笔记5:字符串

字符串 基本字符串操作 字符串也是序列,因此序列的基本操作(索引.分片.连接.乘法.长度.求最大值和最小值.成员资格)对字符串同样适用: 索引 >>> 'a_string'[0] 'a' 长度 >>> len('a_string') 8 求最大值 >>> max('a_string') 't' 求最小值 >>> min('a_string') '_' 乘法 >>> 'a_string'*2 'a_stringa_st

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python基础教程(第十章 自带电池)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5459376.html______ Created on Marlowes 现在已经介绍了Python语言的大部分基础知识.Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装中还包括一组模块,称为标准库(standard library).之前已经介绍了一些模块(例如math和cmath,其中包

Python基础教程(第六章 抽象)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5351415.html______ Created on Xu Hoo 本章将会介绍如何将语句组织成函数,这样,你可以告诉计算机如何做事,并且只需要告诉一次.有了函数以后,就不必反反复复像计算机传递同样的具体指令了.本章还会详细介绍参数(parameter)和作用域(scope)的概念,以及地柜的概念及其在程序中的用途. 6.1

Python基础教程(第五章 条件、循环和其他语句)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5329066.html______ Created on Xu Hoo 读者学到这里估计都有点不耐烦了.好吧,这些数据结构什么的看起来都挺好,但还是没法用它们做什么事,对吧? 下面开始,进度会慢慢加快.前面已经介绍过了几种基本语句(print语句.import语句.赋值语句).在深入介绍条件语句和循环语句之前,我们先来看看这几种基

&lt;&lt;Python基础教程&gt;&gt;学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >

Python基础教程(第二章 列表和元组)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5293195.html______ Created on Xu Hoo 本章将引入一个新的概念:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence),序列中的每个元素被分配一个序号——即

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以