WindRoa 发表于 2020-6-28 22:41:02

老哥们,这段代码格式化顺序如何理解

本帖最后由 WindRoa 于 2020-6-28 23:02 编辑

# 根据指定的宽度打印格式良好的价格列表
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('Apples', 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)


好吧,换一种问法……为什么第5、6行代码是3层花括号?

为什么我用pycharm调试 运行完5、6行代码之后就只剩一层花括号了?

Twilight6 发表于 2020-6-28 22:41:03

本帖最后由 Twilight6 于 2020-6-28 23:16 编辑

WindRoa 发表于 2020-6-28 23:06
这个是啥原因?运行完5、6行代码后有两层花括号消失?



在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符

所以这里的花括号你多括一次,就会导致打印的是花括号本身里面的内容,而不是你后面的格式化想传入的参数哈

当你三层花括号 比如'{{:{}}}'.format(25)就会因为 最外层的花括号是为了转义第二层的花括号,所以你打印出来的花括号此时就是第二层被转义的花括号

因为第二层的花括号被转义了,导致最内层花括号还是有起到作用的 所以此时把 25 替换了最内的花括号所以打印的结果是 {:25}

riodavid 发表于 2020-6-28 22:51:35

什么叫做 “格式化顺序”?

WindRoa 发表于 2020-6-28 22:51:50

我直接把最里面的两个花括号替换成宽度参数,结果程序运行出来一些奇怪的东西……

WindRoa 发表于 2020-6-28 22:52:28

riodavid 发表于 2020-6-28 22:51
什么叫做 “格式化顺序”?

就是花括号接收参数的顺序

WindRoa 发表于 2020-6-28 23:06:24

这个是啥原因?运行完5、6行代码后有两层花括号消失?


WindRoa 发表于 2020-6-28 23:18:38

Twilight6 发表于 2020-6-28 23:09
在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符 ...

那个,原 代码可以正常运行的,我就是不明白为什么5、6行运行下来会消失两个花括号,并不是想打印花括号

另外,我自己先尝试了一下将最内层的花括号替换成参数,但是运行下来出现了图二的结果

而调试的时候,5、6行执行完毕,参数会直接替换两层花括号,这是为什么?不是应该是替换一层吗?

附上程序正常运行结果图



WindRoa 发表于 2020-6-28 23:24:04

Twilight6 发表于 2020-6-28 23:09
在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符 ...

是不是format的时候拿掉了一层,赋值的时候拿掉了一层?

WindRoa 发表于 2020-6-28 23:44:39

Twilight6 发表于 2020-6-28 22:41
在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符 ...

那为什么这里参数会消失啊


Twilight6 发表于 2020-6-29 00:20:13

WindRoa 发表于 2020-6-28 23:44
那为什么这里参数会消失啊

刚才发的评论全被审核了 家里网络不好今天晚上....


你还是没理解我前面的解释,两个花括号在一起时候,是起到转义作用,外面的括号把里面的括号转义了

转义了之后这个被转义的括号就不在有原有的功能了,也就是不在可以像 format 格式化之前替换 {} 花括号了

WindRoa 发表于 2020-6-29 01:53:07

Twilight6 发表于 2020-6-29 00:20
刚才发的评论全被审核了 家里网络不好今天晚上....




稍微明白了点,字符串内的单对花括号是一种特殊字符。格式化过程中,如果在外面嵌套一层花括号会将原来的花括号转义成字符串形式的花括号,这样可以将花括号打印出来。

所以说主题内源代码中的内层花括号起到了接收参数的作用,外层的括号起到了转义的作用,转义后留下来的是中间的那个字符串格式的花括号。


然后格式化过程中,会先转义花括号,再进行传参? 如果被调用字符串内没有花括号这个特殊的字符,参数将无法传入,但是IDLE也不会报错?

tiger吴 发表于 2020-6-29 04:22:50

Twilight6 发表于 2020-6-29 00:20
刚才发的评论全被审核了 家里网络不好今天晚上....




最里面的花括号的值是数字,那么不应该用%d吗,为什么写花括号呢?看的好懵,有文档讲这个的吗?

Twilight6 发表于 2020-6-29 07:32:57

tiger吴 发表于 2020-6-29 04:22
最里面的花括号的值是数字,那么不应该用%d吗,为什么写花括号呢?看的好懵,有文档讲这个的吗?



%d 是 % 号 格式化,这里是 format 格式化,建议先去了解下 format 格式化吧,写的已经很清楚了~

Twilight6 发表于 2020-6-29 07:36:27

WindRoa 发表于 2020-6-29 01:53
稍微明白了点,字符串内的单对花括号是一种特殊字符。格式化过程中,如果在外面嵌套一层花括号会将原来的 ...


稍微明白了点,字符串内的单对花括号是一种特殊字符。格式化过程中,如果在外面嵌套一层花括号会将原来的花括号转义成字符串形式的花括号,这样可以将花括号打印出来。

所以说主题内源代码中的内层花括号起到了接收参数的作用,外层的括号起到了转义的作用,转义后留下来的是中间的那个字符串格式的花括号。

是的你的理解没错了!


如果被调用字符串内没有花括号这个特殊的字符,参数将无法传入,但是IDLE也不会报错?

有花括号存在时候,当被转义了后,不管后面format里有没参数,都不会报错的~ 记住这点就好

yhhpf 发表于 2020-6-29 11:10:33

Twilight6 发表于 2020-6-28 22:41
在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符 ...

学到了学到了~~~
页: [1]
查看完整版本: 老哥们,这段代码格式化顺序如何理解