2012-08-24 32 views
4

我正在使用python2.7,我想知道Python元組字符串插值背後的推理是什麼。使用元組切片的Python字符串插值?

def show(self): 
    self.score() 
    print "Player has %s and total %d." % (self.player,self.player_total) 
    print "Dealer has %s showing." % self.dealer[:2] 

打印:

Player has ('diamond', 'ten', 'diamond', 'eight') and total 18 
Traceback (most recent call last): 
File "trial.py", line 43, in <module> 
    Blackjack().player_options() 
    File "trial.py", line 30, in player_options 
    self.show() 
    File "trial.py", line 27, in show 
    print "Dealer has %s showing." % (self.dealer[:2]) 
TypeError: not all arguments converted during string formatting 

所以我發現我需要改變其中的錯誤是從哪裏來的第四行,在做這個代碼小一點,當我陷入了TypeErrors這個:

print "Dealer has %s %s showing." % self.dealer[:2] 

有兩個%s運算符,每個元素分片一個。當我被檢查出發生了什麼事情與這條線雖然我在print type(self.dealer[:2])增加,並會得到:

<type 'tuple'> 

像我預料的,爲什麼會非切片元組像Player has %s and total %d." % (self.player,self.player_total)格式罰款和切片的元組self.dealer[:2]不?它們都是同一類型,爲什麼不在沒有明確格式化切片中的每個項目的情況下傳遞切片?

回答

6

切片沒有問題。傳遞元組數量不正確的元組文本時,您會得到相同的錯誤。

"Dealer has %s showing." % self.dealer[:2] 

是一樣的:

"Dealer has %s showing." % (self.dealer[0], self.dealer[1]) 

這顯然是錯誤的。

所以,如果你想格式化self.dealer[:2]無元組拆包:

"Dealer has %s showing." % (self.dealer[:2],) 
+0

這很有道理謝謝你。我誤解了正在發生的事情。我認爲當傳遞的元組切片是一個較小的整個元組時,不會傳遞兩個單獨的參數。那是怎麼回事,對嗎? – tijko

+2

你永遠不會傳遞「兩個不同的論點」。語法'「string」%(foo,bar)'是一個表達式,它包含具有兩個字面操作數的字符串和元組的'%'二元運算符。即使在着名的pythonic'a,b = b,a''你用元組操作。字符串插值只是爲字符串重載的'%'運算符。 –

3

您的錯誤源於這樣一個事實,即在第二個格式化操作中,您傳遞的參數數量不正確。

"dealer has %s %s showing" % self.dealer[:2] 

"dealer has %s showing" % list(self.dealer[:2]) 

"dealer has %s showing" % self.dealer[0] #or self.dealer[1] 

它無關,與不使用元組文字。

+1

當您第一次發佈關於參數數量和您的評論的TypeError時,我仍然沒有弄清楚元組切片分解爲兩個單獨的參數而不是整個元組切片。@Eldar Abusalimov發佈時,我終於意識到自己的錯誤。 – tijko

5

路線插值需要的元組參數的每個元素的格式代碼。你也可以使用字符串的新.format方法:

>>> dealer = ('A','J','K') 
>>> print 'Dealer has {} showing'.format(dealer[:2]) 
Dealer has ('A', 'J') showing 

但是請注意,用一個參數你打印的元組的字符串表示,用括號和逗號一起。你可以使用tuple解包來分別發送參數,但是你需要兩個格式的佔位符。

>>> print 'Dealer has {} {} showing'.format(*dealer[:2]) 
Dealer has A J showing 
+0

你使用'.format'是用Python3做這件事的常用方法,對嗎? – tijko

+2

是的,但它也回溯到Python 2.6及更高版本。早期版本(3.0和2.6,我相信}不支持'{}',而是'{0}'來指示位置參數的放置。'.format'在新代碼中更受歡迎 –

+0

很高興知道,謝謝: ) – tijko