鱼C论坛

 找回密码
 立即注册
查看: 1647|回复: 14

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

[复制链接]
发表于 2020-6-28 22:41:02 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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行代码之后就只剩一层花括号了?
最佳答案
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}

最佳答案

查看完整内容

在 Python format格式化中 如果你想打印花括号 就只能多嵌套个花括号进行转义,而不是使用转义字符 所以这里的花括号你多括一次,就会导致打印的是花括号本身里面的内容,而不是你后面的格式化想传入的参数哈 当你三层花括号 比如 '{{:{}}}'.format(25) 就会因为 最外层的花括号是为了转义第二层的花括号,所以你打印出来的花括号此时就是第二层被转义的花括号 因为第二层的花括号被转义了,导致最内层花括号还 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-28 22:51:35 | 显示全部楼层
什么叫做 “格式化顺序”?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-28 22:51:50 | 显示全部楼层
我直接把最里面的两个花括号替换成宽度参数,结果程序运行出来一些奇怪的东西……

TIM截图20200628225135.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-28 22:52:28 | 显示全部楼层
riodavid 发表于 2020-6-28 22:51
什么叫做 “格式化顺序”?

就是花括号接收参数的顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-28 23:06:24 | 显示全部楼层
这个是啥原因?运行完5、6行代码后有两层花括号消失?


TIM截图20200628230444  .png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

附上程序正常运行结果图



TIM截图2020---.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是不是format的时候拿掉了一层,赋值的时候拿掉了一层?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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


TIM截图1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-29 00:20:13 | 显示全部楼层
WindRoa 发表于 2020-6-28 23:44
那为什么这里参数会消失啊

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


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

转义了之后这个被转义的括号就不在有原有的功能了,也就是不在可以像 format 格式化之前替换 {} 花括号了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-29 01:53:07 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-6-29 00:20
刚才发的评论全被审核了 家里网络不好今天晚上....



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

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


然后格式化过程中,会先转义花括号,再进行传参? 如果被调用字符串内没有花括号这个特殊的字符,参数将无法传入,但是IDLE也不会报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-29 04:22:50 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-6-29 00:20
刚才发的评论全被审核了 家里网络不好今天晚上....



最里面的花括号的值是数字,那么不应该用%d吗,为什么写花括号呢?看的好懵,有文档讲这个的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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



%d 是 % 号 格式化,这里是 format 格式化,建议先去了解下 format 格式化吧,写的已经很清楚了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

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


是的  你的理解没错了!


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


有花括号存在时候,当被转义了后,不管后面format里有没参数,都不会报错的~ 记住这点就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

学到了学到了~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表