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在我的位置的任何一侧,围绕新加密的密钥。

+1

如果您需要此帮助,请向我们显示'plaintext' – jacoblaw

+7

'range()'不包含'stop'值,所以'range(len(明文))'就足够了。注意:'对于pos,枚举中的char(明文):'可能更好。 – AChampion

+0

'范围(len(明文))' –

range(lower, upper)返回一个包含从lower开始到upper-1结束的值的列表。如果len(plaintext) == 3,那么您的列表正确包含元素01

至于你的错误,你还没有包括相关的代码。

+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)): 

在您的代码的第二部分,假定plaintextcrypt具有相同的长度, 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)时,才会执行。