expandtabs()参数小于等于字符长度时探究

在小甲鱼的课程(第十四讲)中我们学到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中指定的长度小于字符串长度时,回是一个空格乘以负数,可以吗?所以我又试了一下。

" "*(-1)
Out[5]: ''

哦啊,真的可以,返回了一个空字符串,那么就是它啦!我信心满满的给这位鱼油回复了过去。

然而,不尽人意的事情发生了,鱼油把我的答案采纳为最佳答案后,他又问了我这样的问题。

str1 = 'i\tam\thappy'
str1.expandtabs(1) 'i am happy'
str1.expandtabs(2) 'i am happy'

那您能解释一下这个代码吗 参数为1的时候,位置数比给定的小,i和am后面的换行符换成了空字符串(也就是一个空格?)我能理解
参数为2的时候,我认为应该是i后面一个空格,am后面,因为参数没有大于位置数,所以也应该是一个个空格啊,但是结果出现了两个空格
[/quote]

OMG我拿到编译器里试了一下,确实如此,[size=5]卧槽?[/size]

我自己又拿出几个例子试一试

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'[/code]

[code]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'

意,确实找不到规律。肿么办?百度上没有任何更多的帮助,我把视线投向了官方文档。

[quote] Tab positions occur every tabsize bytes (default is 8, giving
tab positions at columns 0, 8, 16 and so on). [/quote]

官方文档描述如上,也就是制表符位置每一个制表符大小字节出现一次(默认为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是九个字符),[color=RoyalBlue]3的倍数[/color],

str1.expandtabs(4)
Out[37]: 'i   am  happ1232y   hahaahha'

这里happ1232y 和后面的空格加一起是12个字符,[color=SeaGreen]4的倍数[/color]

好了,也就是说expandtabs()给定的参数是一个因子,如果字符串的长度小于等于给定的因子,就取给定的因子整数倍。

也就是说百度上那个代码并不是真正的源代码

问题解决,撒花。

所以啊要严谨,不能不懂装懂,我错了!当然以上也只是我探索的结果,希望各位指正~

希望对大家有所帮助!

首发地址:
expandtabs()参数小于等于字符长度时探究--
https://fishc.com.cn/thread-156862-1-1.html
(出处: 鱼C论坛)

posted @ 2020-03-24 21:06  柳然  阅读(159)  评论(0编辑  收藏  举报