Python 3.3中非常奇怪的bug
好的,我做了一个小函数,它允许我把一个字符串变成32个字符的乘法器,但是当我使用string.replace时,我得到了一些非常非常奇怪的错误。因为它让我拉扯我的头发,你们能看看我遗漏了什么吗Python 3.3中非常奇怪的bug,python,string,Python,String,好的,我做了一个小函数,它允许我把一个字符串变成32个字符的乘法器,但是当我使用string.replace时,我得到了一些非常非常奇怪的错误。因为它让我拉扯我的头发,你们能看看我遗漏了什么吗 Variables: self.blockSize = 32 self.interrupt = '$^EnD#Block^$' self.filler = '#' Functions: def pad(self, data): jo
Variables:
self.blockSize = 32
self.interrupt = '$^EnD#Block^$'
self.filler = '#'
Functions:
def pad(self, data):
joint1 = ''.join([data, self.interrupt])
joint2 = self.filler * ((self.blockSize - len(joint1)) % self.blockSize)
return ''.join([joint1, joint2])
def unpad(self, data):
data = str(data).rstrip(self.interrupt)
return data.replace(self.filler, '')
Call:
p = e.pad('this is not a very good idea yo')
print(p)
print(e.unpad(p))
Output:
Jans-MacBook-Pro:test2 jan$ ../../bin/python3 data.py
this is not a very good idea yo123$^EnD#Block^$################
this is not a very good idea yo123
Jans-MacBook-Pro:test2 jan$ ../../bin/python3 data.py
this is not a very good idea yo$^EnD#Block^$###################
this is not a very good idea y
Jans-MacBook-Pro:test2 jan$
它使o在yo中消失。啊!但如果我在后面加上一些随机数,什么都不会消失
解决方案-编辑:我的坏。我把self.filler和self.interrupt放错地方了。我现在很尴尬。守则应该是:
def unpad(self, data):
data = str(data).rstrip(self.filler)
return data.replace(self.interrupt, '')
读取rstrip
:
chars参数是一个字符串,指定要删除的字符集
rstrip
删除传递的字符集中存在的所有尾随字符。它不会删除按该顺序包含这些字符的尾随子字符串<代码>'abczyx'.rstrip('xyz')给出了'abc'
,而'abczyx'.rstrip('zyx')
也给出了'abc'
读取rstrip
:
chars参数是一个字符串,指定要删除的字符集
rstrip
删除传递的字符集中存在的所有尾随字符。它不会删除按该顺序包含这些字符的尾随子字符串<代码>'abczyx'.rstrip('xyz')给出了'abc'
,而'abczyx'.rstrip('zyx')
也给出了'abc'
,s1+s2
是''的一个较短的等价物。join([s1,s2])
。你应该让这个问题的标题更具描述性,以备以后搜索。有人说join更快…@JanNetherdrake取决于[1]:%timeit“test”+“test”中字符串的大小。
100000000个循环,每个循环最好3:15.2ns在[2]:%timeit.”join((“test”,“test”))
10000000个循环,每个循环最好3:98.9纳秒
作为旁白,s1+s2
是''的一个较短的等价物。join([s1,s2])
。你应该让这个问题的标题更具描述性,以防以后搜索。有人说join更快…@JanNetherdrake取决于[1]中字符串的大小:%timeit“test”+“test”
<10000000个循环,每个循环的最佳值为3:15.2ns在[2]:%timeit>中。加入((“test”,“test”)
<10000000个循环,每个循环的最佳值为3:98.9ns好的。但是为什么.replace和.rstrip会删除o,而o在第一个位置上没有定义要删除?当字符串以“yo”结尾时,它以“o”结尾。“o”出现在“中断”字符串中,这意味着它是要删除的字符之一。所以它被剥离了。哦,糟糕,我找到了问题的原因:)我分别错放了self.filler和self.interrupt。这有多蠢?好吧。但是为什么.replace和.rstrip会删除o,而o在第一个位置上没有定义要删除?当字符串以“yo”结尾时,它以“o”结尾。“o”出现在“中断”字符串中,这意味着它是要删除的字符之一。所以它被剥离了。哦,糟糕,我找到了问题的原因:)我分别错放了self.filler和self.interrupt。这有多愚蠢?