關於格式化元組數據的一個坑
阿新 • • 發佈:2019-04-09
pytho 需要 就是 att form for 打印 解釋器 單個
究其根本原因,其實是
參照上面的代碼,我們發現,
在每個單個數據後加上逗號後,數據的類型變成了我們想要的
關於格式化元組數據的一個坑
問題描述
這裏有一個關於元組格式化輸出的問題,直接看下面代碼:
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
關於格式化元組數據的一個坑