1. 程式人生 > >關於格式化元組數據的一個坑

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

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

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