首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ord函数(ord(B[0]) - ord('0'))

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

Stack Overflow用户
提问于 2014-02-15 22:21:18
回答 3查看 7K关注 0票数 2

我最近开始学习Python。我读马克·卢茨第四版。我在一本书中看到了这段代码(见下文)。这段代码会发生什么?我没有写第4行,你能解释一下吗?对不起我的英语不好。

代码语言:javascript
复制
B = '1101'
I = 0
while B != '':
     I = I * 2 + (ord(B[0]) - ord('0'))
     B = B[1:] 
print(I)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-15 22:24:29

代码语言:javascript
复制
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)替换。

代码语言:javascript
复制
In [168]: int(B, 2)
Out[168]: 13

因此,理解代码所做的工作是很好的,但不要将其视为如何将二进制字符串表示转换为相应int的Pythonic示例。

代码语言:javascript
复制
In [161]: help(ord)
    Return the integer ordinal of a one-character string.

线

代码语言:javascript
复制
I = I * 2 + (ord(B[0]) - ord('0'))

正在递增I,以便将字符串B转换为intB被解释为int的二进制表示,这段代码正在计算该int的值。

代码语言:javascript
复制
1101 (base 2) = 2**3 + 2**2 + 2**0 = 2*(2*((2*1) + 1) + 0) + 1

while-循环是在右边计算表达式,首先从最里面最括号的表达式开始,然后开始工作。

票数 1
EN

Stack Overflow用户

发布于 2014-02-15 22:25:31

此算法将二进制数转换为其十进制表示形式。二进制数1011等于11,因为:

代码语言:javascript
复制
1      0      1      1
^      ^      ^      ^
2^3 +  0   +  2^1  + 2^0   = 11

因此,计算是通过将i乘以2(以二进制格式向左移动)并添加0或1来完成的。

代码语言:javascript
复制
1    ->   1
11   ->   1 * 2 + 1   = 3
011  ->   3 * 2 + 0   = 6
1011 ->   6 * 2 + 1   = 11

ord在这里不是很有用:它返回一个字符字符串的整数序号。但是,在这里,如果字符串为"1“,则需要1,如果字符串为0,则为0。因此,使用int(B)更好。

代码语言:javascript
复制
>>> ord("1") - ord("0")
1
>>> ord("0") - ord("0")
0

奖励:一种更毕达通的方式

如果您喜欢Python、列表理解和sum函数,下面是给出的算法的一行:

代码语言:javascript
复制
>>> sum(2**i for i, x in enumerate(reversed(B)) if x == '1')
11

但是,最好的解决方案仍然是使用int内置方法:

代码语言:javascript
复制
>>> int(B, base=2)
11
票数 2
EN

Stack Overflow用户

发布于 2014-02-15 22:27:40

ord(ch)返回一个字符的字节值- "a“为65,"b”为66,等等。

如果字符是数字,ord(ch) - order("0")返回数字的数值- "0“变为o,"1”变为1,等等。

总的来说,代码解析一个包含二进制数的强值,并在I中收集该数字的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21804437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档