1

我知道我可以使用转义序列获取 unicode 字符,如下所示:

>>> print "\3"
♥

我只是想查看可用的 ASCII 字符并写下这个:

for i in xrange(1, 99):
    print "\%o" % i

它打印“\1”、“\2”、“\3”等,所以不是unicode字符。然后我使用 %s、%r 和 %d 进行了尝试,但这些似乎都不起作用。

这比看到可用的 ASCII 字符有趣得多,所以我开始阅读有关字符串格式的内容,并最终完成了这篇文章:

for i in xrange(1, 99):

    print "{:c}".format(i)

问题是 - 为什么初始代码不起作用?

4

3 回答 3

2

Python 将其解释\%o为“文字反斜杠后跟字符串格式化代码”;\%在 python 文字中没有任何意义,因此反斜杠包含在字面上。

您正在寻找chr()功能

for i in xrange(1, 99):
    print chr(i)

\字符转义仅适用于 python 文字。您可以指示 python 解释包含文字\反斜杠 pus 代码的任意字符串,以使用编解码器将其解释为 python 字符串文字string_escape

>>> print repr('\\n'.decode('string_escape')
'\n'

请注意,指定 unicode 文字的正确\uxxxx方法是使用格式,并使用 unicode 字符串文字:

>>> print u'\u2665'
♥

原始字节也可以使用\x00转义序列生成:

>>> print repr('\x12')
'\n'
于 2012-09-16T14:11:33.230 回答
2

字符串文字中的转义序列在"parse time"处理,而不是在"run time"处理。如果你写

"\%o"

Python 解析器看到一个反斜杠后跟一个百分号,因为这不是一个有效的转义序列,它只会保留两个字符,然后也会添加o为普通字符(请注意,在这个 Python 中,它不同于例如它的 C++ 编程语言会将该字符串解释为"%o"因为在该语言中,百分号前的反斜杠仅被解释为百分号)。

在运行时,格式化运算符将在左侧看到由三个字符、一个反斜杠和一个%o序列组成的字符串,该部分将被右侧替换,例如"\\1"输入值 1 的字符串和字符串显示为\1

于 2012-09-16T14:22:11.470 回答
1

Python 源代码中的字符串文字在词法分析期间被解释——Python 编译器执行源代码处理的第一步。转义序列被解析,并且只有结果字符串存储在内存中。这就是为什么例如

>>> "A"
'A'
>>> "\x41"
'A'

产生完全相同的字符串。在实际打印字符串或执行字符串格式化时,不会处理转义序列。打印基本上意味着将字符串的内容复制到终端。格式化意味着用所需的内容插入%或占位符。{}字符串的其余部分保持不变。

格式化选项的结果

>>> "\%03o" % 65
'\\101'

是一个由四个字符组成的字符串\101。(在交互式解释器中,显示了该字符串的表示形式;这就是为什么您会看到引号和双反斜杠的原因。)"\101"另一方面,字符串文字是只有一个字符的字符串,即大写字母A

正如 Martijn Pieters 所指出的,您可以使用string_escape编解码器显式请求解释转义序列:

>>> ("\%03o" % 65).decode("string_escape")
'A'
于 2012-09-16T14:20:45.093 回答