我知道我可以使用转义序列获取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)
问题是 - 为什么初始代码不起作用?
答案 0 :(得分:2)
Python将\%o
解释为'字面反斜杠后跟字符串格式代码'; \%
并不意味着python文字中的任何内容,因此字面上包含反斜杠。
您正在寻找chr()
function:
for i in xrange(1, 99):
print chr(i)
\
字符转义仅适用于python文字。你可以指示python解释包含文字\
反斜杠脓代码的任意字符串,使用string_escape
编解码器解释为python字符串文字:
>>> print repr('\\n'.decode('string_escape')
'\n'
请注意,指定unicode文字的正确方式是使用\uxxxx
格式,并使用unicode字符串文字:
>>> print u'\u2665'
♥
也可以使用\x00
转义序列生成原始字节:
>>> print repr('\x12')
'\n'
答案 1 :(得分:2)
字符串文字中的转义序列在“解析时”处理,而不是在“运行时”处理。 如果你写
"\%o"
Python解析器看到一个反斜杠后跟一个百分号,因为这不是一个有效的转义序列,它只保留两个字符,然后还会添加o
作为普通字符(请注意,在这个Python中是不同的从例如C ++编程语言,它将该字符串解释为"%o"
,因为在该语言中,百分号之前的反斜杠仅被解释为百分号)。
在运行时,格式化操作符将在左侧看到由三个字符组成的字符串,一个反斜杠和一个%o
序列,这是将被右侧替换的部分,例如字符串"\\1"
表示输入值1,该字符串显示为\1
。
答案 2 :(得分:1)
Python源代码中的字符串文字在词法分析期间被解释 - 这是Python编译器执行的源代码处理的第一步。解析转义序列,并且只将结果字符串存储在内存中。这就是为什么,例如。
>>> "A"
'A'
>>> "\x41"
'A'
产生完全相同的字符串。实际打印字符串或执行字符串格式化时,不会处理转义序列。打印基本上是指将字符串的内容复制到终端。格式化意味着用所需内容插入%
或{}
占位符。字符串的其余部分保持不变。
格式化opartion的结果
>>> "\%03o" % 65
'\\101'
是一个由四个字符\101
组成的字符串。 (在交互式解释器中,显示了此字符串的表示;这就是您看到引号和双后斜杠的原因。)另一方面,字符串文字"\101"
是一个字符串只有一个字符,即大写A
。
正如Martijn Pieters所指出的,你可以使用string_escape
编解码器明确要求解释转义序列:
>>> ("\%03o" % 65).decode("string_escape")
'A'