關於格式化元組數據的一個坑

關於格式化元組數據的一個坑

問題描述

這裏有一個關於元組格式化輸出的問題,直接看下面代碼:
tu = ('w','h','w')
lis = ['w','n','m']
s1 = '列表數據:%s,元組數據:%s' % (lis,tu)
print(s1)
輸出的結果爲:
列表數據:['w', 'n', 'm'],元組數據:('w', 'h', 'w')
乍一看沒得啥子問題,可是若是咱們只格式化輸出元組中的數據試試:
tu = ('w','h','w')
s2 = '元組數據:%s' % tu
print(s2)
結果會報錯:
TypeError: not all arguments converted during string formatting
可是咱們直接格式化輸出列表就沒問題:
lis = ['w','n','m']
s3 = '列表數據:%s' % lis
print(s3)
結果:
列表數據:['w', 'n', 'm']

緣由分析:

Python元組自己的問題

究其根本緣由,實際上是Python元組自己的一個BUG:
print((123),type((123)))
print(('abc'),type(('abc')))
print(([11,22,33]),type(([11,22,33])))
結果爲:
123 <class 'int'>
abc<class 'str'>
[11, 22, 33]<class 'list'>
參照上面的代碼,咱們發現,(123)('abc')([11,22,33])這三個數形式上是元組,由於它們都被小括號包起來了。可是打印的結果倒是被包起來的數據類型的自己。而解決這個問題的方法就是在單個數據後面加上一個逗號:
print((123,),type((123,)))
print(('abc',),type(('abc',)))
print(([11,22,33],),type(([11,22,33],)))
結果爲:
(123,) <class 'tuple'>
('abc',) <class 'tuple'>
([11, 22, 33],) <class 'tuple'>
在每一個單個數據後加上逗號後,數據的類型變成了咱們想要的tuple

格式化元組的問題

再回到咱們上面的問題中來,若是咱們把一個元組當作格式化的對象,python解釋器實際上是把元組裏面的每一個元素當作參數去格式化的,也就是說須要一一去匹配操做符,而前面只有一個操做符,數量少於元組中的元素,所以會拋出上面的錯誤。

解決方法

針對上述狀況,解決方法有兩個:若是想把元組當成一個總體輸出,能夠處理一下元組輸出的格式;若是想把元組中的數據一一格式化出來,能夠在前面補全操做符。

處理元組的輸出格式

直接上代碼:
tu = ('w','h','w')
s2 = '元組數據:%s' % (tu,)
print(s2)
結果以下:
元組數據:('w', 'h', 'w')

補全操做符的方法

tu = ('w','h','w')
s2 = '元組數據:%s %s %s' % tu
print(s2)
結果以下:
元組數據:w h w
相關文章
相關標籤/搜索