【问题标题】:Python chr() explainPython chr() 解释
【发布时间】:2015-01-28 03:28:16
【问题描述】:

所以我很确定这是一个愚蠢的问题,但我正在尝试更深入地了解 python chr() 函数。 另外,我想知道是否可以始终将整数参数设置为三位数,或者对于所有 ascii 值仅使用固定长度?

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

为什么它给了我不同的答案?它认为'020'是十六进制还是什么? 另外,我在 Windows 上运行 Python 2.7! -谢谢!

【问题讨论】:

  • 在 Python 2 中,以0 开头的数字是八进制。在 Python 3 中,这是一个语法错误。
  • 那么有没有办法让整数参数总是固定长度?
  • 仅当您不介意用八进制数字表示所有整数时
  • 不,这行不通。长度只固定在十进制数 64 之后。:(
  • 我试图从一个字符串创建一个整数块,并且我试图利用方法来区分每个字符在整数块中的位置。所以如果每个 x 数字代表一个字符,它会为我节省很多时间 lol

标签: python windows ascii chr


【解决方案1】:

与字符无关。这都是关于数字文字的。它是跨语言的。 0 表示八进制,0x 表示十六进制。

print 010 # 8
print 0x10 # 16

【讨论】:

  • 有没有一种方法或函数允许 chr() 只排除十进制整数而不是评估所有内容?这有点烦人哈哈
  • @ChrisNguyen,与chr 无关。编译器创建作为参数传递的int 对象。整数文字可以用十进制 (10)、八进制 (8) 和十六进制 (16) 表示。你不能禁用它。您可以通过在运行时创建 int 来强制基础,例如int('010', 10) == 10.
  • @Chris Nguyen:澄清一​​下:chr 不会评估所有内容。 160x10020(或0o20)和0b10000都是同一个数字。它们在代码中看起来不同,但在内存中它们是相等的。
  • 从解析器到编译器的概述。看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'
【解决方案2】:

chrord 一起解释是有意义的。

您显然使用的是 Python2(由于八进制问题,Python3 需要 0o 作为前缀),但我会解释两者。

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

在 Python3 中,chr 返回一个单字符的 unicode 字符串。字节字符串的等价物是bytes([v])ord 仍然两者兼而有之。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多