2015-07-13 85 views
0

你好,我目前正在學習如何在python 2.7中使用字符串格式,並且im在特定場景中產生的特定錯誤消息中稍有混淆。python 2.7中的字符串格式

  1. 確定這樣的第一塊代碼,我已經寫運行按預期它是:

    print "My name is %s and my age is %d years old!" % ('Bob', 30) 
    
  2. 的稍微改變代碼的第二片也運行良好,它是(使用兩個(或多個)轉換):

    print "My name is %s and my age is %s years old!" % ('Bob', 30) 
    
  3. 然而第三代碼段輸出和錯誤(使用一個(d)和一個(或多個)轉換):

    print "My name is %d and my age is %s years old!" % ('Bob', 30) 
    

在方案3我得到的錯誤信息:

%d format: a number is required, not str 

所以我的問題是,爲什麼在方案2中允許(在預期小數放置(S)的轉換),但反過來講在場景3中是不允許的。謝謝,我希望我儘可能地解釋我的問題。

+4

您可以將整數轉換爲字符串,而不是相反。 –

+0

因爲可以將小數轉換爲字符串,但不能將字符串轉換爲小數。在你的情況下,你正嘗試將'Bob'投射到%d。 – Kadir

回答

2

應該

print "My name is %s and my age is %d years old!" % ('Bob', 30) 

錯誤被拋出,因爲它預期的整數值%d但得到的字符串%s

INT可以轉換成字符串所以前一種情況並沒有受到影響

+0

我明白,如果你看看情景1,你會看到我已經給出了這個例子,並說它運行良好。但我的問題是爲什麼場景2允許ie;將一個(s)轉換放在一個預期的十進制數上,但反過來說,對預期的字符串進行(d)轉換是不允許的。 – at541

+0

@ at541這是因爲當調用%s時,隱含的'str()'在該值上運行,但不在'%d'的情況下運行 – The6thSense

+0

好的,謝謝我現在在您的答案中看到編輯,因此更有意義。 – at541

1

在場景1中,python將整數隱式轉換爲double。到現在爲止還挺好。

在場景2中,python執行從整數到字符串的隱式轉換,這是可能的。然而,在情況3中,python必須將包含字符的字符串轉換爲double,這是不可能的。

2

這是因爲%s使用str()函數將另一個python類型轉換爲字符串。但%d只接受整數小數。

欲瞭解更多信息,請閱讀String Formatting Operations

另外請注意,您可以任意數量轉換爲字符串沒有錯誤,但你不能任意字符串轉換爲整數,因爲它可能會產生一種ValueError

>>> int('s') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 's' 

這只是工作的數字:

>>> int('12') 
12 
+0

upvoted只是爲了添加鏈接 – The6thSense

2

有一種更好的方式來格式化Python中的字符串(可能會讓你感興趣)。 它與對象類型無關。 通過列表

"{0}-{1}: {2}".format(1,"foo",True) 

通過字典

"{num}-{string}: {bool}".format(**{"num":1,"string":"foo","bool":True}) 

更多信息:https://docs.python.org/2/library/stdtypes.html#str.format