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

Posted 江湖乄夜雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于格式化元组数据的一个坑相关的知识,希望对你有一定的参考价值。

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

问题描述

这里有一个关于元组格式化输出的问题,直接看下面代码:
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

以上是关于关于格式化元组数据的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

趁着课余时间学点Python用课余时间提升自己关于高级数据类型的知识

趁着课余时间学点Python用课余时间提升自己关于高级数据类型的知识

Cpp:将字符串片段解析为元组

在学习爬虫的路上,有多少坑在前边