使用ord函数(ord(B [0]) - ord('0'))

时间:2014-02-15 22:21:19

标签: python

我最近开始学习Python。我读过Mark Lutz第4版。在一本书中,我看到了代码(如下)。这段代码会发生什么?我不会不喜欢第4行。你能解释一下吗?抱歉我的英语不好。

B = '1101'
I = 0
while B != '':
     I = I * 2 + (ord(B[0]) - ord('0'))
     B = B[1:] 
print(I)

3 个答案:

答案 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

奖金:更多的Pythonic方式

如果你喜欢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',当0B[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转换为Bint被解释为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中收集数字的值。