我相信这是一个愚蠢的问题,但我正在尝试更深入地了解Python chr()函数。同时,我想知道是否可能始终将整数参数设为三位数,或者对于所有ASCII值都有固定长度?
chr(20) ## '\x14'
chr(020) ## '\x10'
为什么会给我不同的答案?它是否认为“020”是十六进制或其他内容?此外,我在Windows上运行Python 2.7!-谢谢!
这与字符无关,而是与数字字面量有关,而且它是跨语言的。0表示八进制,0x表示十六进制。
print 010 # 8
print 0x10 # 16
chr
没有关系。编译器会创建作为参数传递的 int
对象。整数字面量可以用十进制(10)、八进制(8)和十六进制(16)表示。您不能禁用它。您可以通过在运行时创建 int
来强制指定基数,例如 int('010', 10) == 10
。 - Eryk Sunchr
不会评估所有内容。16
,0x10
,020
(或0o20
)和0b10000
都是相同的数字。它们在代码中看起来不同,但在内存中它们是相等的。 - Matthiascode = 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解释 chr
和 ord
是有意义的。
你显然在使用Python2(因为八进制问题,Python3需要前缀0o
),但我会解释两种情况。
在Python2中,chr
是一个函数,它接受任何整数直到 256
并返回一个仅包含该扩展 ASCII 字符的字符串。 unichr
是相同的,但返回 unicode 字符到 0x10FFFF
。 ord
是反向函数,它接受一个单个字符的字符串(任何类型)并返回一个整数。
在Python3中,chr
返回一个单个字符的 unicode 字符串。字节字符串的等效方法是 bytes([v])
。 ord
仍然可以同时执行这两个功能。
0
开头的数被视为八进制数。但在Python 3中,这将导致语法错误。 - Mark Ransom