Python chr() 解释

4

我相信这是一个愚蠢的问题,但我正在尝试更深入地了解Python chr()函数。同时,我想知道是否可能始终将整数参数设为三位数,或者对于所有ASCII值都有固定长度?

chr(20) ## '\x14'
chr(020) ## '\x10'

为什么会给我不同的答案?它是否认为“020”是十六进制或其他内容?此外,我在Windows上运行Python 2.7!-谢谢!

3
在Python 2中,以数字0开头的数被视为八进制数。但在Python 3中,这将导致语法错误。 - Mark Ransom
那么有办法让整数参数始终保持固定的长度吗? - Chris Nguyen
只有在您不介意使用八进制数字表示所有整数时才能执行此操作。 - Jeremy Friesner
不行,那样做不行。长度只有在小数点后64位之后才会固定。:( - Chris Nguyen
我正在尝试从一个字符串中创建一个整数块,并且我试图利用区分每个字符在整数块中的位置的方法。因此,如果每个x个数字表示一个单独的字符,那么这将节省我很多时间。哈哈 - Chris Nguyen
可能是重复的问题:如何避免以“0”开头的Python数字文字被视为八进制? (https://dev59.com/umgu5IYBdhLWcg3wLEM9) - Brent Washburne
2个回答

1

这与字符无关,而是与数字字面量有关,而且它是跨语言的。0表示八进制,0x表示十六进制。

print 010 # 8
print 0x10 # 16

有没有一种方法或函数可以让chr()仅接受十进制整数,而不是评估所有内容?这有点烦人哈哈 - Chris Nguyen
3
@ChrisNguyen,这与 chr 没有关系。编译器会创建作为参数传递的 int 对象。整数字面量可以用十进制(10)、八进制(8)和十六进制(16)表示。您不能禁用它。您可以通过在运行时创建 int 来强制指定基数,例如 int('010', 10) == 10 - Eryk Sun
1
@Chris Nguyen:只是为了明确一下:chr不会评估所有内容。160x10020(或0o20)和0b10000都是相同的数字。它们在代码中看起来不同,但在内存中它们是相等的。 - Matthias
从解析器到编译器的概述。看一下 code = compile('chr(020)', '', 'eval'); dis.dis(code)LOAD_CONST 指令从 code.co_consts[0] 中加载 int 对象。接下来看抽象语法树(编译器看到的 Python 代码):astree = ast.parse('chr(020)', '', 'eval'); ast.dump(astree)。这里的字面值已经是一个 int,即 astree.body.args[0].n == 16。最后,看一下解析器的语法树:stree = parser.expr('chr(020)'); stree.totuple()。在那里,您可以看到标记 (2, '020'),其中 token.tok_name[2] == 'NUMBER' - Eryk Sun

0

解释 chrord 是有意义的。

你显然在使用Python2(因为八进制问题,Python3需要前缀0o),但我会解释两种情况。

在Python2中,chr 是一个函数,它接受任何整数直到 256 ​​并返回一个仅包含该扩展 ASCII 字符的字符串。 unichr 是相同的,但返回 unicode 字符到 0x10FFFFord 是反向函数,它接受一个单个字符的字符串(任何类型)并返回一个整数。

在Python3中,chr 返回一个单个字符的 unicode 字符串。字节字符串的等效方法是 bytes([v])ord 仍然可以同时执行这两个功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接