字符串索引不起作用? - Python

时间:2016-11-12 17:14:36

标签: python string

我正在制作一种需要向后读取字符串的密码,即使我引用的索引在范围内,我也会得到索引错误:

M = str(input("Input Message: "))
M = M.upper()
L = len(M)
A = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]

def DECRYPT():
    global L
    global M
    global A

    if L%2 != 0:
        POS = False
    else:
        POS = True

    i = L-1
    NM = ""
    while 1:
        if M[i] != " ":
            INDEX = A.index(M[i])
            if POS == True:
                INDEX += (i + 1)
            else:
                INDEX -= (i)
            INDEX %= 26        
            NM = NM+A[INDEX]
            i += 1
            if POS == True:
                POS = False
            else:
                POS = True
    print("\n"+NM)

def ENCRYPT():
    global L
    global A
    global M

    POS = True
    M = M[::-1]
    i = 0
    NM = ""

    while 1:
        if i == L:
            break
        if M[i] != " ":
            INDEX = A.index(M[i])
            if POS == True:
                INDEX += (i + 1)
            else:
                INDEX -= (i + 1)
            INDEX %= 26        
            NM = NM+A[INDEX]
        i += 1
        if POS == True:
            POS = False
        else:
            POS = True
    print("\n"+NM)

while 1:
    C = int(input("\nWhat do you want to do:\n1) Encrypt Something\n2)Decrypt Something\n\n"))
    if C == 1:
            ENCRYPT()
    if C == 2:
            DECRYPT()

其中i是占位符值。我跑了,得到了这个:

Input Message: ABC

What do you want to do:
1) Encrypt Something
2)Decrypt Something

2
Traceback (most recent call last):
  File "C:\Users\Danny\Google Drive\SHIFT.py", line 67, in <module>
    DECRYPT()
  File "C:\Users\Danny\Google Drive\SHIFT.py", line 19, in DECRYPT
    if M[i] != " ":
IndexError: string index out of range

我试过改变i的价值无济于事。

2 个答案:

答案 0 :(得分:1)

您的代码存在多个问题:正如fernand0所指出的,您的索引运行方式错误;你的POS的反转发生在代码的不同层面,加密器在每个字符上执行,解密器在每个字母上执行它们 - 它们的工作方式相同;你的六个全球声明中有五个不是必需的;你没有正确处理断字,所以解密不符合原件;加密后,无法在同一会话中解密,因为本地NM没有反馈到全局M

以下是我对代码的修改,解决了上述问题和一些样式问题。这里的关键词是&#39;简化&#39;。我保留了你奇怪的大写变量名称,但是将它们从单个字符扩展到它们所代表的内容:

MESSAGE = input("Input Message: ").upper()
ALPHABET = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
ALPHABET_LENGTH = len(ALPHABET)

def DECRYPT(MESSAGE):

    LENGTH = len(MESSAGE)
    IS_NEGATIVE = True

    NEW_MESSAGE = ""

    for I in range(LENGTH):

        if MESSAGE[I] in ALPHABET:
            INDEX = ALPHABET.index(MESSAGE[I])
            if IS_NEGATIVE:
                INDEX -= (I + 1)
            else:
                INDEX += (I + 1)
            INDEX %= ALPHABET_LENGTH
            NEW_MESSAGE += ALPHABET[INDEX]

            IS_NEGATIVE = not IS_NEGATIVE
        else:
            NEW_MESSAGE += MESSAGE[I]

    return NEW_MESSAGE[::-1]

def ENCRYPT(MESSAGE):

    MESSAGE = MESSAGE[::-1]

    LENGTH = len(MESSAGE)
    IS_POSITIVE = True

    NEW_MESSAGE = ""

    for I in range(LENGTH):

        if MESSAGE[I] in ALPHABET:
            INDEX = ALPHABET.index(MESSAGE[I])
            if IS_POSITIVE:
                INDEX += (I + 1)
            else:
                INDEX -= (I + 1)
            INDEX %= ALPHABET_LENGTH
            NEW_MESSAGE += ALPHABET[INDEX]

            IS_POSITIVE = not IS_POSITIVE
        else:
            NEW_MESSAGE += MESSAGE[I]

    return NEW_MESSAGE

while True:
    print("\nWhat do you want to do:")
    print("1) Encrypt Message")
    print("2) Decrypt Message")

    CHOICE = int(input("\n"))

    if CHOICE == 1:
        MESSAGE = ENCRYPT(MESSAGE)
    if CHOICE == 2:
        MESSAGE = DECRYPT(MESSAGE)

    print("\n" + MESSAGE)

<强> TEST

> python3 file.py
Input Message: An opportunity to teach is an opportunity to learn

What do you want to do:
1) Encrypt Message
2) Decrypt Message

1

OPDAQ HB OEWAGIBFXIU JD RI JZEZZ GC NFVBFJAGWJT KC

What do you want to do:
1) Encrypt Message
2) Decrypt Message

2

AN OPPORTUNITY TO TEACH IS AN OPPORTUNITY TO LEARN

What do you want to do:
1) Encrypt Message
2) Decrypt Message

答案 1 :(得分:0)

你是在字符串末尾开始我然后,你正在增加它。我认为i + = 1行应该是i - = 1

相关问题