马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 dlnb526 于 2020-2-17 19:12 编辑
在小甲鱼的课程(第十四讲)中我们学到expandtabs() 方法把字符串中的 tab 符号('\t')转为空格,tab 符号('\t')默认的空格数是 8
今天有一个鱼油问了这样的问题
expandtabs后面不添加说明的话是默认空格长度为8个字符串,小甲鱼老师上课讲的那个例子'i\tlove\tfish'使用这个方法后输出'i love fish',i后面有7个空格,love后面有4个空格,因为这8个字符除了空格还要包括反斜杠前面的字符。
那么下面这个,str2 = 'i\tlove\tfish',str2.expandtabs(2),这个会输出什么,第一个i后面会有一个空格我能理解,但是第二个反斜杠前面的love本身就已经有四个字符了,按说应该要报错的吧,但是我在尝试的时候反而输出了一个结果
emmm很有意思
确实如果expandtabs指定的长度比字符串小会怎么样呢。
通过百度,我查到了一个疑似expandtabs() 的源代码如下def expandtabs(string, n):
result = ""
pos = 0
for char in string:
if char == "\t":
# instead of the tab character, append the
# number of spaces to the next tab stop
char = " " * (n - pos % n)
if char == "\n":
pos = 0
else:
pos += len(char)
result += char
return result
嗯。按照这个代码,当我在expandtabs中指定的长度小于字符串长度时,回是一个空格乘以负数,可以吗?所以我又试了一下。
哦啊,真的可以,返回了一个空字符串,那么就是它啦!我信心满满的给这位鱼油回复了过去。
然而,不尽人意的事情发生了,鱼油把我的答案采纳为最佳答案后,他又问了我这样的问题。
>>> str1 = 'i\tam\thappy'
>>> str1.expandtabs(1)
'i am happy'
>>> str1.expandtabs(2)
'i am happy'
那您能解释一下这个代码吗
参数为1的时候,位置数比给定的小,i和am后面的换行符换成了空字符串(也就是一个空格?)我能理解
参数为2的时候,我认为应该是i后面一个空格,am后面,因为参数没有大于位置数,所以也应该是一个个空格啊,但是结果出现了两个空格
OMG我拿到编译器里试了一下,确实如此,卧槽?
我自己又拿出几个例子试一试str1 = 'i\tam\thapp1232y\thahaahha'
str1.expandtabs(5)
Out[35]: 'i am happ1232y hahaahha'
str1.expandtabs(3)
Out[36]: 'i am happ1232y hahaahha'
str1.expandtabs(4)
Out[37]: 'i am happ1232y hahaahha'
str1 = 'i\tam\thappy'
str1.expandtabs(2)
Out[19]: 'i am happy'
str1.expandtabs(5)
Out[20]: 'i am happy'
str1 = 'i\tam\thappy\thahaahha'
str1.expandtabs(5)
Out[22]: 'i am happy hahaahha'
str1 = 'i\tam\thapp1232y\thahaahha'
str1.expandtabs(5)
Out[24]: 'i am happ1232y hahaahha'
意,确实找不到规律。肿么办?百度上没有任何更多的帮助,我把视线投向了官方文档。
Tab positions occur every tabsize bytes (default is 8, giving tab positions at columns 0, 8, 16 and so on).
官方文档描述如上,也就是制表符位置每一个制表符大小字节出现一次(默认为8,在列0、8、16等处给出制表符位置)。
也就是说,默认值虽然是8,但它空格的位置可能是8,16等这种8的倍数。倍数!我在之前的查阅中也看到了这种字眼,但是没有放在心上,那么关键就是它了!
我回去仔细查了查试验时候的结果,Bingo!如果expandtabs参数中给定的值比字符串的长度要小,就取它的整数倍来进行处理了。
比如str1 = 'i\tam\thapp1232y\thahaahha'
str1.expandtabs(5)
Out[35]: 'i am happ1232y hahaahha'
这里happ1232y 和后面的空格加一起是10个字符,str1.expandtabs(3)
Out[36]: 'i am happ1232y hahaahha'
这里happ1232y 和后面的空格加一起是12个字符(happ1232y是九个字符),3的倍数,str1.expandtabs(4)
Out[37]: 'i am happ1232y hahaahha'
这里happ1232y 和后面的空格加一起是12个字符,4的倍数
好了,也就是说expandtabs()给定的参数是一个因子,如果字符串的长度小于等于给定的因子,就取给定的因子整数倍。
也就是说百度上那个代码并不是真正的源代码。
问题解决,撒花。
所以啊~要严谨,不能不懂装懂,我错了~!当然以上也只是我探索的结果,希望各位指正~
希望对大家有所帮助!
原帖链接:<font color="red">[已解决]</font>字符串内置方法expandtabs的使用方法
https://fishc.com.cn/thread-156834-1-1.html
(出处: 鱼C论坛)
|