鱼C论坛

 找回密码
 立即注册
查看: 2655|回复: 9

[已解决]第15课:格式化%符号,FishC 的答案看不懂

[复制链接]
发表于 2021-1-6 16:12:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Peteryo01223 于 2021-1-6 16:15 编辑

小甲鱼给出的题目的答案:

q = True
while q:
    num = input('请输入一个整数(输入Q结束程序):')
    if num != 'Q':
        num = int(num)
        print('十进制 -> 十六进制 : %d -> 0x%x' % (num, num))
        print('十进制 -> 八进制 : %d -> 0o%o' % (num, num))
        print('十进制 -> 二进制 : %d -> ' % num, bin(num))
    else:
        q = False

我的问题:
1. print('十进制 -> 十六进制 : %d -> 0x%x' % (num, num)) 这里面,%d -> 0x%x' %,为什么在第二个%前面出现了 0x? 视频中格式化都是 %后面才能加英文字母。
2. print('十进制 -> 二进制 : %d -> ' % num, bin(num)) 这里面,单引号,为什么结束在第二个%前面?比较上面的两行code,两个单引号都是结束在第三个%前面的。

请高手,尽量直白地解释一下。感觉小甲鱼,视频中,有不少知识点没有提到。

谢谢

最佳答案
2021-1-6 16:48:16
    1、0x 其实就是表示是十六进制数,否则,十六进制的 1234 如果没有这个前导 0x 还不被你认为是十进制数?
    2、print('十进制 -> 二进制 : %d -> ' % num, bin(num))  括号中被逗号分开的其实是两个参数,第一个参数是字符串 '十进制 -> 二进制 : %d -> ' % num,第二个参数是 bin(num),也就是一 num 为参数,对内置函数 bin() 的调用结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 16:29:31 | 显示全部楼层
1,0x就是单纯的字符呀,没有什么特殊的
2,这说明了后面那个bin(num)并不会被填入字符串中,你看那个字符串,
是不是只有一个格式化操作符?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 16:40:46 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-1-6 16:42 编辑
qiuyouzhi 发表于 2021-1-6 16:29
1,0x就是单纯的字符呀,没有什么特殊的
2,这说明了后面那个bin(num)并不会被填入字符串中,你看那个字符 ...


0x 是普单纯的什么字符啊?0x写在什么逻辑呢?貌似跟%+英文字母的格式化列表,一点儿关系也没有。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 16:48:16 | 显示全部楼层    本楼为最佳答案   
    1、0x 其实就是表示是十六进制数,否则,十六进制的 1234 如果没有这个前导 0x 还不被你认为是十进制数?
    2、print('十进制 -> 二进制 : %d -> ' % num, bin(num))  括号中被逗号分开的其实是两个参数,第一个参数是字符串 '十进制 -> 二进制 : %d -> ' % num,第二个参数是 bin(num),也就是一 num 为参数,对内置函数 bin() 的调用结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 16:48:39 | 显示全部楼层
Peteryo01223 发表于 2021-1-6 16:40
0x 是普单纯的什么字符啊?0x写在什么逻辑呢?貌似跟%+英文字母的格式化列表,一点儿关系也没有。

0o 开头就表明这一串字符是一个八进制数
0x 开头就表明这一串字符是一个小写的十六进制数
0X 开头就表明这一串字符是一个大写的十六进制数

仅仅是一个标识符而已,没有别的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 16:54:50 | 显示全部楼层
jackz007 发表于 2021-1-6 16:48
1、0x 其实就是表示是十六进制数,否则,十六进制的 1234 如果没有这个前导 0x 还不被你认为是十进制数 ...

1. 哦,我明白了,原来是小甲鱼自己加上的0x。如果用#,让python自己显示出0x,我就懂了。现在了解了,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 16:56:27 | 显示全部楼层
Daniel_Zhang 发表于 2021-1-6 16:48
0o 开头就表明这一串字符是一个八进制数
0x 开头就表明这一串字符是一个小写的十六进制数
0X 开头就表 ...

谢谢。0x代表十六进制,我本来理解,但是我一直以为0x仅仅会出现在run后的结果里面,是一个python打印得结果。没想到这次是小甲鱼,自己为了便于表达,直接帮助我们大家写进去了。理解了,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 16:57:35 | 显示全部楼层
Peteryo01223 发表于 2021-1-6 16:56
谢谢。0x代表十六进制,我本来理解,但是我一直以为0x仅仅会出现在run后的结果里面,是一个python打印得 ...

嗯嗯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 17:00:39 | 显示全部楼层
qiuyouzhi 发表于 2021-1-6 16:29
1,0x就是单纯的字符呀,没有什么特殊的
2,这说明了后面那个bin(num)并不会被填入字符串中,你看那个字符 ...

好的。0x 是小甲鱼主动写在code里,代表十六进制的意思,省得打印出来混淆。我觉得,如果他直接用 # 就好了,让Python自动在数字前面打印出十六进制的标志0x。看来,在格式化中,%后面的英文字母才有意义,前面的就是个符号,不参与格式化预算。多谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 17:35:46 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-1-6 18:07 编辑

说句题外话:

小甲鱼的答案中,核心3个语句,如下,

print('十进制 -> 十六进制 : %d -> 0x%x' % (num, num))
print('十进制 -> 八进制 : %d -> 0o%o' % (num, num))
print('十进制 -> 二进制 : %d -> ' % num, bin(num))

前两个语句,在 ‘  ’  当中,做了两次格式化运算。
而第三个语句,由于没有现成的二进制格式化符号,在 ‘  ’ 中仅做了一次格式化运算,加上后面bin(),得出结果。

如果我小小修改一下:

1. 三个语句统一结构,都是用 ‘  ’  当中仅仅做一次格式化,后面单独做一次格式化,然后加在一起,这样的结构来编写程序。那么,就使得,三句的结构完全相同,上下便于初学者比对,并理解。
2. 用#,自动显示八进制(%#o)和十六进制(%#x)的符号,而不使用小甲鱼的方式(直接在%前面写0x和0o,因为没有基础的我,当时误以为0x和0o是格式化计算的一个部分,要和%产生什么关系呢)

那么我觉得,出于方便初学者阅读的考虑,或许我可以如下改写一下:

q = True
while q:
    num = input('请输入一个整数(输入Q结束程序):')
    if num != 'Q':
        num = int(num)
        print('十进制 -> 十六进制 : %d -> ' % num, ' %#x' % num)
        print('十进制 -> 八进制 : %d -> ' % num, ' %#o' % num)
        print('十进制 -> 二进制 : %d -> ' % num, bin(num))
    else:
        q = False

请教大家,不知我说的对不?

毕竟我是初学,贸然修改老师的答案,我可能会错的更厉害吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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