for循环不够循环 - Python
我正在Python中制作一个加密工具,并且这个过程的一部分是用加密位置重新分配每个位置。该代码是指在此通过该代码来实现每个字符运行加密:for循环不够循环 - 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 视窗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中分配一个位置,所以我的解决方法是concatenat在我的位置的任何一侧,围绕新加密的密钥。
range(lower, upper)
返回一个包含从lower
开始到upper-1
结束的值的列表。如果len(plaintext) == 3
,那么您的列表正确包含元素0
和1
。
至于你的错误,你还没有包括相关的代码。
我不知道如果值得回答,本来会更好的评论。 –
range(3)
为您提供了序列[0, 1, 2]
,因此在您的示例中,您希望拥有range(len(plaintext))
(无论如何,下限默认为零)。
但是,遍历字符串中每个字符的pythonic方法(假设这是您的实际目标)将是for c in plaintext
。也有一个枚举(同时获得该字符和索引)使用方法:
for i, c in enumerate(plaintext):
print('pos is %s" % (i))
如果plaintext
长度为3,那么当你做len(plaintext)-1
这等于2.设置一个范围内range(0,2)
总是会导致只有0和1。您可以测试,使用该行:
print(list(range(0, len(plaintext)-1)))
这将只输出[0,1]
换句话说,第二个参数range
是上限,但本身并不包含
现在,对于你的第二部分 - 看起来当你达到2时,在你的代码的其余部分有一些东西被访问,其中只有2个项目,所以给它一个索引2就是搜索第三个项目(因为我们开始索引在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)
时,才会执行。
如果您需要此帮助,请向我们显示'plaintext' – jacoblaw
'range()'不包含'stop'值,所以'range(len(明文))'就足够了。注意:'对于pos,枚举中的char(明文):'可能更好。 – AChampion
'范围(len(明文))' –