Peteryo01223 发表于 2021-1-6 16:12:42

第15课:格式化%符号,FishC 的答案看不懂

本帖最后由 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,两个单引号都是结束在第三个%前面的。

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

谢谢

qiuyouzhi 发表于 2021-1-6 16:29:31

1,0x就是单纯的字符呀,没有什么特殊的
2,这说明了后面那个bin(num)并不会被填入字符串中,你看那个字符串,
是不是只有一个格式化操作符?

Peteryo01223 发表于 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写在什么逻辑呢?貌似跟%+英文字母的格式化列表,一点儿关系也没有。

jackz007 发表于 2021-1-6 16:48:16

    1、0x 其实就是表示是十六进制数,否则,十六进制的 1234 如果没有这个前导 0x 还不被你认为是十进制数?
    2、print('十进制 -> 二进制 : %d -> ' % num, bin(num))括号中被逗号分开的其实是两个参数,第一个参数是字符串 '十进制 -> 二进制 : %d -> ' % num,第二个参数是 bin(num),也就是一 num 为参数,对内置函数 bin() 的调用结果。

Daniel_Zhang 发表于 2021-1-6 16:48:39

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

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

仅仅是一个标识符而已,没有别的意思

Peteryo01223 发表于 2021-1-6 16:54:50

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

1. 哦,我明白了,原来是小甲鱼自己加上的0x。如果用#,让python自己显示出0x,我就懂了。现在了解了,谢谢。

Peteryo01223 发表于 2021-1-6 16:56:27

Daniel_Zhang 发表于 2021-1-6 16:48
0o 开头就表明这一串字符是一个八进制数
0x 开头就表明这一串字符是一个小写的十六进制数
0X 开头就表 ...

谢谢。0x代表十六进制,我本来理解,但是我一直以为0x仅仅会出现在run后的结果里面,是一个python打印得结果。没想到这次是小甲鱼,自己为了便于表达,直接帮助我们大家写进去了。理解了,谢谢。

Daniel_Zhang 发表于 2021-1-6 16:57:35

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

嗯嗯

Peteryo01223 发表于 2021-1-6 17:00:39

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

好的。0x 是小甲鱼主动写在code里,代表十六进制的意思,省得打印出来混淆。我觉得,如果他直接用 # 就好了,让Python自动在数字前面打印出十六进制的标志0x。看来,在格式化中,%后面的英文字母才有意义,前面的就是个符号,不参与格式化预算。多谢。

Peteryo01223 发表于 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

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

毕竟我是初学,贸然修改老师的答案,我可能会错的更厉害吧。
页: [1]
查看完整版本: 第15课:格式化%符号,FishC 的答案看不懂