鱼C论坛

 找回密码
 立即注册
查看: 2081|回复: 19

[已解决]关于Python中expandtabs的用法

[复制链接]
发表于 2020-8-14 15:24:02 | 显示全部楼层 |阅读模式

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

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

x
  先说几个在论坛里面看到的
   比如dlnb526 老哥讲解的
>>>str1 = 'i\tam\thapp1232y\thahaahha'
>>>str1.expandtabs(5)
'i    am   happ1232y hahaahha'
这段代码中\t的转换方法是因为\t前面的字符数是9,而给定参数为5,所以按dlnb526老哥的解释是因为python的内置机制当参数小于前面字符数时默认按倍数来,即5*2-9,happ1232y后面空一格,而给定参数
大于字符数时,比如
>>>str1 = 'i\tam\thappy'
>>> str1.expandtabs(5)
'i    am   happy'
给出的解释i后面的\t转换的字符数5-1=4,m后面的\t为5-2=3
上述两例似乎能够完美解答疑惑,但是在我多次测试后又发现问题了,比如下面的程序
>>> str1='i want goto\tschool'
>>> str1.expandtabs()
'i want goto     school'
goto后面的空格数是5,怎么数都是5,按照前面的方法8-4=4才对呀,但是这里偏偏是5,完全懵圈了。。。。。。。
可能是我点子背吧,又连着试了好几个,比如下面的
>>> str1='i want gotothe\tschool'
>>> str1.expandtabs(3)
'i want gotothe school'
>>> str1.expandtabs(8)
'i want gotothe  school'
>>> str1.expandtabs(16)
'i want gotothe  school'
>>> str1.expandtabs(28)
'i want gotothe              school'
>>> str1.expandtabs(32)
'i want gotothe                  school'
参数3的时候the后面1个空格,参数8的时候2个空格,参数28的时候14个空格,参数32的时候18个空格,彻底懵圈了。。。。。。。。
有没有人能帮忙看看,是不是我理解出了问题,为什么会出现这样的情况?叩谢!!!!!!!
最佳答案
2020-8-14 15:35:39
'i want goto' 的长度是 11,默认不指定参数是 expandtabs(8),添加 5 个空格就能凑成 16 个字符(8 的倍数)。其他的同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-14 15:35:39 | 显示全部楼层    本楼为最佳答案   
'i want goto' 的长度是 11,默认不指定参数是 expandtabs(8),添加 5 个空格就能凑成 16 个字符(8 的倍数)。其他的同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 15:54:56 | 显示全部楼层
zltzlt 发表于 2020-8-14 15:35
'i want goto' 的长度是 11,默认不指定参数是 expandtabs(8),添加 5 个空格就能凑成 16 个字符(8 的倍数 ...

>>> str1='i want gotothe\tschool'
>>> str1.expandtabs()
默认8的时候,前面字符数11,按照你所说的取8的倍数就是16,中间空格应该是5才对,实际是2呀?这咋回事?我被整懵圈了。。。。。。。折腾了一天。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 15:59:51 | 显示全部楼层
额,这个问题我之前也碰到过,但是后来一想,反正用到这个的时候基本也是制表之类的,都是多个\t的时候才用到,就没太纠结了。
只要多个\t能实现,每个之间相同的空格字符就好了。没必要纠结吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 16:02:04 | 显示全部楼层
jackshi70 发表于 2020-8-14 15:54
>>> str1='i want gotothe\tschool'
>>> str1.expandtabs()
默认8的时候,前面字符数11,按照你所说的 ...

'i want gotothe' 是 14 个字符。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-14 16:09:55 | 显示全部楼层
zltzlt 发表于 2020-8-14 16:02
'i want gotothe' 是 14 个字符。。。

大恩不言谢,兄弟啊,你让我今晚能睡个安稳觉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 16:11:31 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:09
大恩不言谢,兄弟啊,你让我今晚能睡个安稳觉了

客气了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:20:25 | 显示全部楼层
整明白了,顺便附上一个地址https://blog.csdn.net/SinclairWa ... 1018.2118.3001.4187,他的解释也挺好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:24:43 | 显示全部楼层
yhhpf 发表于 2020-8-14 15:59
额,这个问题我之前也碰到过,但是后来一想,反正用到这个的时候基本也是制表之类的,都是多个\t的时候才用 ...

我一般习惯于先纠结一阵。。。。。,不过现在应该已经解决了。。。。。哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 16:25:00 | 显示全部楼层
zltzlt 发表于 2020-8-14 16:02
'i want gotothe' 是 14 个字符。。。

  1. >>> s = str1.expandtabs(4)
  2. >>> s
  3. 'i want gotothe  school'
  4. >>> s = str1.expandtabs(5)
  5. >>> s
  6. 'i want gotothe school'
复制代码

额,仔细看了下,我和他碰到的问题不一样,参数4和5,反而4比5多了个空格。不过没太纠结- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 16:26:03 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:24
我一般习惯于先纠结一阵。。。。。,不过现在应该已经解决了。。。。。哈哈哈

那你看下我楼下发你的这个,哈哈哈哈,要不要再纠结会儿?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 16:34:20 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:24
我一般习惯于先纠结一阵。。。。。,不过现在应该已经解决了。。。。。哈哈哈

对了,还有个,不同编译器,肉眼看到的结果还可能不一样,会对不齐,哈哈,反正这玩意感觉不太好用。
IDLE和pycharm结果就不一样(肉眼看到的结果)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:38:32 | 显示全部楼层
yhhpf 发表于 2020-8-14 16:25
额,仔细看了下,我和他碰到的问题不一样,参数4和5,反而4比5多了个空格。不过没太纠结- -

好吧!就让我充当一次大佬给你解惑了,i want gotothe  是14个字符,你参数为4的时候,因为参数字符数少于\t前面的字符数,而python的机制是当参数字符数少于实际字符数的时候按照8,16这种倍数机制来,引用一段转自CSDN的程序段:
  1. print("第一行为基准")
  2. print("123456789012345678901")
  3. s1 = "123456\t7890\t123"
  4. print(s1)
  5. print(s1.expandtabs(6))
  6. print(s1.expandtabs(7))
  7. print(s1.expandtabs(8))
  8. print(s1.expandtabs(9))
  9. s2 = "\t12\t345678\t123"
  10. print(s2)
  11. print(s2.expandtabs())
复制代码

显示如下:
  1. 第一行为基准
  2. 123456789012345678901
  3. 123456        7890        123
  4. 123456      7890  123
  5. 123456 7890   123
  6. 123456  7890    123
  7. 123456   7890     123
  8.         12        345678        123
  9.         12      345678  123
复制代码

所以对于你说的为啥输入4反而比5多一个空格,原因就是4*4-14=2,5*3-14=1;
咋样?还可以吧。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:41:04 | 显示全部楼层
yhhpf 发表于 2020-8-14 16:34
对了,还有个,不同编译器,肉眼看到的结果还可能不一样,会对不齐,哈哈,反正这玩意感觉不太好用。
ID ...

对不齐是输入法的问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:43:05 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:41
对不齐是输入法的问题吧

反正我这台机子装了两个中文输入法,每次切换不同的输入法写的代码字都不一样大更别提对齐了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 16:59:17 | 显示全部楼层

兄弟,我又有问题了。。。。,如果expandtabs参数值跟\t前面的字符数相等是不是默认一个空格?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 17:20:34 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:38
好吧!就让我充当一次大佬给你解惑了,i want gotothe  是14个字符,你参数为4的时候,因为参数 ...

额,优秀~~~
还好我是不纠结的人,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 17:21:53 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:41
对不齐是输入法的问题吧

不是输入法,
比如:一 和 1,他的宽度是不一样的,而代码不考虑你显示的宽度,只看字符,所以会有出入。不同编译器宽度不一样,所以结果也不一样,总之,这玩意不好用- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 17:26:27 | 显示全部楼层
yhhpf 发表于 2020-8-14 17:21
不是输入法,
比如:一 和 1,他的宽度是不一样的,而代码不考虑你显示的宽度,只看字符,所以会有出入 ...

好吧,鉴于我还是萌新,后面应该会遇到,暂时不再考虑。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 18:05:18 | 显示全部楼层
jackshi70 发表于 2020-8-14 16:59
兄弟,我又有问题了。。。。,如果expandtabs参数值跟\t前面的字符数相等是不是默认一个空格?

我已经试出来了,expandtabs的参数值为1时,不论\t前面多少字符,都只有一个空格,当expandtabs的参数大于1时,增加一个倍数相减
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 11:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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