2015-10-13 228 views
15

正如標題所述,這兩個標誌有什麼區別?看來他們都使用repr()將值轉換爲字符串? 此外,在這行代碼中:Python中!r和%r有什麼區別?

"{0!r:20}".format("Hello") 

!r前面的0做什麼?

+2

的0表示「使用0號位置參數」 - 你只需要它,如果你的意思是使用的位置參數之一不止一次或者你需要支持Python 2.6。 ''{} {}「'.format(...)'被自動編號,以便在Python 2.7和3.x中被視爲」{0} {1}「。 – lvc

+0

可能重複的[Python字符串格式:%與.format](http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format) –

回答

21

%rstr.format()格式操作中不是有效的佔位符;它只適用於old-style % string formatting。它確實通過repr()函數將對象轉換爲表示形式。

str.format(),!r是等價的,但這也意味着您現在可以使用所有format codes作爲字符串。通常str.format()將在對象本身上調用object.__format__()方法,但通過使用!r,則使用repr(object).__format__()代替。

還有!s和(在Python 3中)!a轉換器;這些首先應用str()ascii()函數。

前面的0表示將使用str.format()方法填充該插槽的參數;在你的情況下,位置參數0"Hello"。你可以使用命名爲論證過了,在對象傳遞作爲關鍵字參數:

"{greeting!r:20}".format(greeting="Hello") 

除非你正在使用Python 2.6,你可以省略這個因爲沒有索引或名稱自動編號插槽;第一{}0,第二{}發生在指數1第二個參數,等等

+1

謝謝,你能澄清你的意思是「this也意味着你現在可以使用字符串的所有格式代碼「? –

+1

':'冒號後面的代碼被傳遞給'object .__格式的__()'方法,因此是類型特定的。浮點數字接受來自字符串的不同格式化代碼。因此,如果對象是一個浮點數,那麼當你添加'!r'時,你會使用不同的格式化代碼。 –

相關問題