2013-03-03 49 views
26

爲什麼我不能用元組作爲參數,在新的樣式,格式器(「串」 .format())?它在舊式(「字符串」%)中工作正常?新風格的元組格式作爲參數

此代碼:

>>> tuple = (500000, 500, 5) 
... print "First item: %d, second item: %d and third item: %d." % tuple 

    First item: 500000, second item: 500 and third item: 5. 

這並不:

>>> tuple = (500000, 500, 5) 
... print("First item: {:d}, second item: {:d} and third item: {:d}." 
...  .format(tuple)) 

    Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    ValueError: Unknown format code 'd' for object of type 'str' 

即使{R!}

>>> tuple = (500000, 500, 5) 
... print("First item: {!r}, second item: {!r} and third item: {!r}." 
...  .format(tuple)) 

    Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    IndexError: tuple index out of range 

雖然它與工作方式:

>>> print("First item: {!r}, second item: {!r} and third item: {!r}." 
...  .format(500000, 500, 50)) 

    First item: 500000, second item: 500 and third item: 5. 

回答

45

格式的舊方式使用二元運算符,%。就其性質而言,它只能接受兩個論點。格式化的新方法使用一種方法。方法可以採用任意數量的參數。

由於您有時需要將多個事物傳遞給格式,並且始終創建一個元素的元組有點笨拙,舊式的方法提出了一個黑客問題:如果您將它作爲元組傳遞,它將使用作爲要格式化的元組的內容。如果你傳遞一個元組以外的東西,它將使用它作爲唯一的格式。

的新方法並不需要這樣的破解:因爲它是一種方法,它可以採取任意數量的參數。因此,需要將多種格式作爲單獨的參數傳遞。幸運的是,你可以使用*解開一個元組到參數:

print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*tuple)) 
17

由於icktoofay解釋,在舊樣式格式的,如果你在一個元組通過,巨蟒將自動解壓。

然而,因爲Python認爲你只傳遞一個參數,你不能使用與str.format方法的元組。您將不得不使用*運算符解壓元組,以將每個元素作爲單獨的參數傳遞。

>>> t = (500000, 500, 5) 
>>> "First item: {:d}, second item: {:d} and third item: {:d}.".format(*t) 
First item: 500000, second item: 500 and third item: 5. 

而且,你會注意到我改名爲你tuple變量t - 不變量使用內建的名字,你會覆蓋它們,並可能導致走下賽場的問題。

+3

1爲重命名的變量中。 – 2013-03-03 04:15:25

+1

@Volatility我認爲{:d}是沒有必要的。如果您想要訂購數據,您可以簡單地使用{}或使用元組{0} {1} {2} – GeoStoneMarten 2016-01-07 09:10:52

+0

@GeoStoneMarten中的索引或數據指定訂單,但我同意使用'{:d}'更清楚地表明您想要一個十進制數字(用於讀取您的代碼的其他人) – Petzku 2016-11-02 11:08:27

0

它實際上是可以使用一個元組作爲參數傳遞給format(),如果手動索引的花括號內的元組:

>>> t = (500000, 500, 5) 
>>> print("First item: {0[0]:d}, second item: {0[1]:d} and third item: {0[2]:d}.".format(t)) 
First item: 500000, second item: 500 and third item: 5. 

我覺得這不太清楚比*方法,雖然。