在理解代码方面需要帮助

时间:2018-08-26 14:13:03

标签: python python-3.x

任何人都可以稍微解释一下此代码。我不明白n在这里做什么?我们已经将N = int(input())作为输入,然后为什么选择n=len(bin(N))-2?我不知道。

N = int(input())
n = len(bin(N))-2
for i in range(1,N+1):
    print(str(i).rjust(n) + " " + format(i,'o').rjust(n) + " " + format(i,'X').rjust(n) + " " + format(i,'b').rjust(n))

1 个答案:

答案 0 :(得分:2)

n计算数字N中的位数bin()生成二进制表示形式(零和一),作为带有0b前缀的字符串:

>>> bin(42)
'0b101010'

因此,len(bin(n))用该输出字符串的长度减去2来表示前缀。

请参见bin() documentation

  

将整数转换为以“ 0b”为前缀的二进制字符串。

长度用于设置列的宽度(通过str.rjust(),这会在字符串的前面添加空格以创建宽度为n个字符的输出)。知道最宽的二进制表示形式需要多少个字符会有所帮助。

但是,可以使用int.bitlength() method直接从号码中 获得相同的信息:

>>> N = 42
>>> N.bit_length()
6
>>> len(bin(N)) - 2
6

其他列的数字也过大。您可以改为计算每列的最大宽度,然后使用str.format()或f字符串进行格式化:

from math import log10

N = int(input())
decwidth = int(log10(N) + 1)
binwidth = N.bit_length()
hexwidth = (binwidth - 1) // 4 + 1
octwidth = (binwidth - 1) // 3 + 1

for i in range(1, N + 1):
    print(f'{i:>{decwidth}d} {i:>{octwidth}o} {i:>{hexwidth}X} {i:>{binwidth}b}')