for循环不够循环 - Python

时间:2017-07-19 20:38:11

标签: python python-2.7 loops

我正在使用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中分配位置,所以我的解决方法是连接我的位置的“侧面”,围绕新加密的密钥。

4 个答案:

答案 0 :(得分:0)

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

至于您的错误,您尚未提供相关代码。

答案 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)):

在代码的第二部分中,假设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)时执行。