我最近开始学习Python。我读过Mark Lutz第4版。在一本书中,我看到了代码(如下)。这段代码会发生什么?我不会不喜欢第4行。你能解释一下吗?抱歉我的英语不好。
B = '1101'
I = 0
while B != '':
I = I * 2 + (ord(B[0]) - ord('0'))
B = B[1:]
print(I)
答案 0 :(得分:2)
此算法将二进制数转换为十进制数。二进制数1011等于11,因为:
1 0 1 1
^ ^ ^ ^
2^3 + 0 + 2^1 + 2^0 = 11
因此,计算是通过将I乘以2(以二进制向左移位)并加0或1来进行的。
1 -> 1
11 -> 1 * 2 + 1 = 3
011 -> 3 * 2 + 0 = 6
1011 -> 6 * 2 + 1 = 11
ord
在这里不是很有用:它返回一个单字符串的整数序数。但是,如果字符串为“1”,我们需要1,如果字符串为0,我们需要0。因此,使用int(B [0])会更好。
>>> ord("1") - ord("0")
1
>>> ord("0") - ord("0")
0
如果你喜欢Python,列表理解和sum
函数,这里提供的算法是单行的:
>>> sum(2**i for i, x in enumerate(reversed(B)) if x == '1')
11
但是,最好的解决方案仍然是使用int
内置方法:
>>> int(B, base=2)
11
答案 1 :(得分:1)
In [158]: ord('0')
Out[158]: 48
In [159]: ord('1')
Out[159]: 49
当ord(B[0]) - ord('0')
是字符串1
时,B[0]
是int '1'
,当0
是B[0]
时,它是int '0'
字符串int(B[0])
。简而言之,它只是将字符串转换为int的一种方法。 int
本来会更简单,但作者正在避免int
,因为如果你有int(B, 2)
,则整个代码段可以被In [168]: int(B, 2)
Out[168]: 13
替换。
In [161]: help(ord)
Return the integer ordinal of a one-character string.
所以很好理解代码在做什么,但是 不要将它作为如何将二进制字符串表示转换为相应的int的Pythonic示例。
I = I * 2 + (ord(B[0]) - ord('0'))
该行
I
正在递增B
,以便将字符串int
转换为B
。 int
被解释为int
的二进制表示形式,此代码正在计算1101 (base 2) = 2**3 + 2**2 + 2**0 = 2*(2*((2*1) + 1) + 0) + 1
的值。
{{1}}
while循环正在计算右侧的表达式,首先从最内部括号表达式开始,然后逐步完成。
答案 2 :(得分:0)
ord(ch)
返回字符的字节值 - “a”为65,“b”为66,等等。
如果字符是数字,ord(ch) - order("0")
返回数字的数值 - “0”变为o,“1”变为1,等等。
总体而言,代码解析包含二进制数的强项,并在I中收集数字的值。