我最近开始学习Python。我读马克·卢茨第四版。我在一本书中看到了这段代码(见下文)。这段代码会发生什么?我没有写第4行,你能解释一下吗?对不起我的英语不好。
B = '1101'
I = 0
while B != '':
I = I * 2 + (ord(B[0]) - ord('0'))
B = B[1:]
print(I)发布于 2014-02-15 22:24:29
In [158]: ord('0')
Out[158]: 48
In [159]: ord('1')
Out[159]: 49因此,当ord(B[0]) - ord('0')是字符串'1'时,B[0]是int 0,当B[0]是string '0'时,则是int 0。简而言之,它只是将字符串转换为int的一种方式。int(B[0])本来会更简单,但是作者正在避免使用int,因为如果您有int,那么整个代码可以被int(B, 2)替换。
In [168]: int(B, 2)
Out[168]: 13因此,理解代码所做的工作是很好的,但不要将其视为如何将二进制字符串表示转换为相应int的Pythonic示例。
In [161]: help(ord)
Return the integer ordinal of a one-character string.线
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) + 1while-循环是在右边计算表达式,首先从最里面最括号的表达式开始,然后开始工作。
发布于 2014-02-15 22:25:31
此算法将二进制数转换为其十进制表示形式。二进制数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 = 11ord在这里不是很有用:它返回一个字符字符串的整数序号。但是,在这里,如果字符串为"1“,则需要1,如果字符串为0,则为0。因此,使用int(B)更好。
>>> 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发布于 2014-02-15 22:27:40
ord(ch)返回一个字符的字节值- "a“为65,"b”为66,等等。
如果字符是数字,ord(ch) - order("0")返回数字的数值- "0“变为o,"1”变为1,等等。
总的来说,代码解析一个包含二进制数的强值,并在I中收集该数字的值。
https://stackoverflow.com/questions/21804437
复制相似问题