鱼C论坛

 找回密码
 立即注册
查看: 1619|回复: 1

[技术交流] expandtabs()参数小于等于字符长度时探究--

[复制链接]
发表于 2020-2-17 19:03:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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() 的源代码如下
  1. def expandtabs(string, n):
  2.         result = ""
  3.         pos = 0
  4.         for char in string:
  5.             if char == "\t":
  6.                 # instead of the tab character, append the
  7.                 # number of spaces to the next tab stop
  8.                 char = " " * (n - pos % n)
  9.             if char == "\n":
  10.                 pos = 0
  11.             else:
  12.                 pos += len(char)
  13.             result += char
  14.         return result
复制代码


嗯。按照这个代码,当我在expandtabs中指定的长度小于字符串长度时,回是一个空格乘以负数,可以吗?所以我又试了一下。
  1. " "*(-1)
  2. Out[5]: ''
复制代码


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


                               
登录/注册后可看大图



                               
登录/注册后可看大图



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

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


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


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

  2. str1.expandtabs(5)
  3. Out[35]: 'i    am   happ1232y hahaahha'

  4. str1.expandtabs(3)
  5. Out[36]: 'i  am happ1232y   hahaahha'

  6. str1.expandtabs(4)
  7. Out[37]: 'i   am  happ1232y   hahaahha'
复制代码

  1. str1 = 'i\tam\thappy'

  2. str1.expandtabs(2)
  3. Out[19]: 'i am  happy'

  4. str1.expandtabs(5)
  5. Out[20]: 'i    am   happy'

  6. str1 = 'i\tam\thappy\thahaahha'

  7. str1.expandtabs(5)
  8. Out[22]: 'i    am   happy     hahaahha'

  9. str1 = 'i\tam\thapp1232y\thahaahha'

  10. str1.expandtabs(5)
  11. 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参数中给定的值比字符串的长度要小,就取它的整数倍来进行处理了。
比如
  1. str1 = 'i\tam\thapp1232y\thahaahha'
  2. str1.expandtabs(5)
  3. Out[35]: 'i    am   happ1232y hahaahha'
复制代码


这里happ1232y 和后面的空格加一起是10个字符,
  1. str1.expandtabs(3)
  2. Out[36]: 'i  am happ1232y   hahaahha'
复制代码

这里happ1232y 和后面的空格加一起是12个字符(happ1232y是九个字符),3的倍数
  1. str1.expandtabs(4)
  2. 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论坛)


                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-17 19:24:27 | 显示全部楼层
应该是解释器吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表