我正在使用Python制作加密工具,部分过程是使用加密位置重新分配每个位置。该代码旨在通过以下代码对每个字符运行加密:
for pos in range (0, len(plaintext)-1):
print("pos is %s" % (pos))
以下代码应无关紧要,但可以提供。 运行此代码时,输出为
pos is 0
pos is 1
循环永远不会达到2,尽管'明文'的长度为3.如果我要删除'-1'部分(包括长度和最终位置不一样),我遇到错误,以下代码超出范围(我的眼睛中的以下代码不需要更改,但可以提供)。
任何人都可以理解或解释我的问题吗?
Python 2.7.11 Windows 8.1
编辑:
循环开始后的代码如下,
for pos in range (0, len(plaintext)-1):
print("pos is %s" % (pos))
for k in range (0, key):
if(plaintext[pos] == "z"):
crypt = "%s%s%s" % (crypt[:pos], "a", crypt[pos+1:])
else:
crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], crypt[pos+1:])
由于切片正在引发错误 隐窝[POS + 1:]
因为您无法在2.7.11中分配位置,所以我的解决方法是连接我的位置的“侧面”,围绕新加密的密钥。
答案 0 :(得分:0)
range(lower, upper)
会返回一个列表,其中包含从lower
开始到upper-1
结束的值。如果len(plaintext) == 3
,则您的列表正确包含元素0
和1
。
至于您的错误,您尚未提供相关代码。
答案 1 :(得分:0)
a
为您提供序列range(3)
,因此在您的示例中,您希望[0, 1, 2]
(下限默认为零)。
但是,以字符串形式查看每个字符的pythonic方法(假设这是你的实际目标)将是range(len(plaintext))
。要使用枚举器(同时获取字符和索引):
for c in plaintext
答案 2 :(得分:0)
如果plaintext
的长度为3,则当len(plaintext)-1
等于2时,将范围设置为range(0,2)
将始终仅为0和1。您可以使用以下行测试:
print(list(range(0, len(plaintext)-1)))
仅输出[0,1]
换句话说,range
的第二个参数是上限,但本身并不包含
现在,对于你的第二部分 - 似乎当你到达2时,在你的代码的其余部分的某处,有一些东西被访问,其中只有2个项目,所以给它一个索引2是搜索第3项(因为我们开始索引为0)然后你得到你描述的错误(索引超出范围)。我无法确切地知道为什么没有看到你的代码。
答案 3 :(得分:0)
正如其他人所说,范围的结尾是独占的,这意味着正确的for循环是:
for pos in range(len(plaintext)):
在代码的第二部分中,假设plaintext
和crypt
的长度相同,crypt[pos+1:]
会在最后一个循环中返回错误。例如,如果plaintext
的长度为3,则pos
在最后一个循环中为2,并且crypt[3]
索引超过字符串的末尾。要解决此问题,您可以使用三元运算符:
end = crypt[pos+1:] if pos < len(crypt) else ""
crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], end)
这使crypt[pos+1:]
仅在pos < len(crypt)
时执行。