dlnb526 发表于 2020-2-17 19:03:08

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

本帖最后由 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中指定的长度小于字符串长度时,回是一个空格乘以负数,可以吗?所以我又试了一下。
" "*(-1)
Out: ''

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

static/image/hrline/line2.png

static/image/hrline/5.gif


然而,不尽人意的事情发生了,鱼油把我的答案采纳为最佳答案后,他又问了我这样的问题。
>>> str1 = 'i\tam\thappy'
>>> str1.expandtabs(1)
'i am happy'
>>> str1.expandtabs(2)
'i amhappy'

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


OMG我拿到编译器里试了一下,确实如此,卧槽?


我自己又拿出几个例子试一试
str1 = 'i\tam\thapp1232y\thahaahha'

str1.expandtabs(5)
Out: 'i    am   happ1232y hahaahha'

str1.expandtabs(3)
Out: 'iam happ1232y   hahaahha'

str1.expandtabs(4)
Out: 'i   amhapp1232y   hahaahha'

str1 = 'i\tam\thappy'

str1.expandtabs(2)
Out: 'i amhappy'

str1.expandtabs(5)
Out: 'i    am   happy'

str1 = 'i\tam\thappy\thahaahha'

str1.expandtabs(5)
Out: 'i    am   happy   hahaahha'

str1 = 'i\tam\thapp1232y\thahaahha'

str1.expandtabs(5)
Out: '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: 'i    am   happ1232y hahaahha'

这里happ1232y 和后面的空格加一起是10个字符,
str1.expandtabs(3)
Out: 'iam happ1232y   hahaahha'
这里happ1232y 和后面的空格加一起是12个字符(happ1232y是九个字符),3的倍数,
str1.expandtabs(4)
Out: 'i   amhapp1232y   hahaahha'
这里happ1232y 和后面的空格加一起是12个字符,4的倍数

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

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

问题解决,撒花。

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

希望对大家有所帮助!

原帖链接:<font color="red">[已解决]</font>字符串内置方法expandtabs的使用方法
https://fishc.com.cn/thread-156834-1-1.html
(出处: 鱼C论坛)

https://s2.ax1x.com/2020/02/12/1bZHM9.png

qiuyouzhi 发表于 2020-2-17 19:24:27

应该是解释器吧{:10_256:}
页: [1]
查看完整版本: expandtabs()参数小于等于字符长度时探究--