关于格式化元组数据的一个坑

关于格式化元组数据的一个坑

问题描述

这里有一个关于元组格式化输出的问题,直接看下面代码:
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
posted on 2019-04-09 19:15  江湖乄夜雨  阅读(223)  评论(0编辑  收藏  举报