鱼C论坛

 找回密码
 立即注册
查看: 2139|回复: 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 个字符。。。

>>> s = str1.expandtabs(4)
>>> s
'i want gotothe  school'
>>> s = str1.expandtabs(5)
>>> s
'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的程序段:
print("第一行为基准")
print("123456789012345678901")
s1 = "123456\t7890\t123"
print(s1)
print(s1.expandtabs(6))
print(s1.expandtabs(7))
print(s1.expandtabs(8))
print(s1.expandtabs(9))
s2 = "\t12\t345678\t123"
print(s2)
print(s2.expandtabs())
显示如下:
第一行为基准
123456789012345678901
123456        7890        123
123456      7890  123
123456 7890   123
123456  7890    123
123456   7890     123
        12        345678        123
        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-6-12 04:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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