关于格式化元组数据的一个坑
问题描述
这里有一个关于元组格式化输出的问题,直接看下面代码:
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
原文地址:https://www.cnblogs.com/paulwhw/p/10679055.html
时间: 2024-11-02 11:42:50