在学习Python艰难之路第21页,我看到这个代码示例:
x = "There are %d types of people." % 10
...
print "I said: %r." % x
Run Code Online (Sandbox Code Playgroud)
为什么%r在这里使用而不是%s?你何时使用%r,何时使用%s?
%r以下陈述中的含义是什么?
print '%r' % (1)
Run Code Online (Sandbox Code Playgroud)
我想我已经听说过%s,%d和%f,但从来没有听说过这一点.
我试图找到一种从变量打印原始形式的字符串的方法.例如,如果我为一个路径的窗口添加一个环境变量,可能看起来像'C:\ Windows\Users\alexb \'我知道我可以这样做:
print(r'C:\\Windows\Users\alexb\')
Run Code Online (Sandbox Code Playgroud)
但是我不能在一个变量前面放一个r ......用于表达
test = 'C:\\Windows\Users\alexb\'
print(rtest)
Run Code Online (Sandbox Code Playgroud)
显然只会尝试打印rtest
我也知道
test = 'C:\\Windows\Users\alexb\'
print(repr(test))
Run Code Online (Sandbox Code Playgroud)
但这会返回'C:\ Windows\Users\x07lexb'
test = 'C:\\Windows\Users\alexb\'
print(test.encode('string-escape'))
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有任何优雅的方式来使变量持有该路径打印RAW,仍然使用测试.如果它只是它会很好
print(raw(test))
Run Code Online (Sandbox Code Playgroud)
但它不是:(
给定一个包含字符串的变量是否可以快速将其转换为另一个原始字符串变量?
以下代码应说明我所追求的内容:
line1 = "hurr..\n..durr"
line2 = r"hurr..\n..durr"
print(line1 == line2) # outputs False
print(("%r"%line1)[1:-1] == line2) # outputs True
Run Code Online (Sandbox Code Playgroud)
到目前为止我找到的最接近的是%r格式化标志,它似乎返回一个原始字符串,尽管在单引号内.有没有更简单的方法来做这种事情?
我偶尔会使用Python字符串格式.这可以这样做:
print('int: %i. Float: %f. String: %s' % (54, 34.434, 'some text'))
Run Code Online (Sandbox Code Playgroud)
但是,这也可以这样做:
print('int: %r. Float: %r. String: %r' % (54, 34.434, 'some text'))
Run Code Online (Sandbox Code Playgroud)
以及使用%s:
print('int: %s. Float: %s. String: %s' % (54, 34.434, 'some text'))
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:为什么我会使用%r或%s以外的任何东西?其他选项(%i,%f和%s)对我来说似乎毫无用处,所以我只是想知道为什么每个人都会使用它们?
[edit]在%s中添加了示例
In [4]: import re
In [5]: print(re.escape('\n'))
\
In [6]: print(re.escape(r'\n'))
\\n
In [7]: print(r'\n')
\n
In [8]: print('\n')
In [9]: print('\\n')
\n
Run Code Online (Sandbox Code Playgroud)
第三个示例print(r'\n')给出了我想要的输出(也是最后一个示例)。
但是我要打印的字符串是未定义为原始字符串的变量。
不用说我不能手动在字符串中添加反斜杠。