Vigenere 密码语法错误

Posted

技术标签:

【中文标题】Vigenere 密码语法错误【英文标题】:Vigenere Cipher syntax errors 【发布时间】:2018-08-31 14:56:29 【问题描述】:

我应该做一个这样的程序:

$Python 
vigenere.py
Type a message:
The crow flies at midnight!
Encryption key:
boom
Uvs fsck rmwse bh auebwsih!

使用 Vigenere 密码

我将使用一个辅助函数并将其导入到这个函数中,我知道这是可行的

import string

alphabet_pos = "abcdefghijklmnopqrstuvwxyz"
def alphabet_position(letter):

    pos = alphabet_pos.index(letter.lower())
    return pos 

def rotate(letter, rot):
    pos = alphabet_position(letter)
    new_pos = (pos + rot) % 26
    new_char = alphabet_pos[new_pos]

    return new_char

之后我开始加密它的 Vigenere 部分

from helpers import alphabet_position, rotate
from caesar import encrypt

    def encrypt(text,key):
        #Declare variable
        cipher = ''

        #Compute length
        l = len(key)

        #Assign value
        idx = 0

        #Loop
        for i in text:
            #if condition satisfies
            if i.isalpha():

                #Call method
                cipher += rotate_character(i,alphabet_position(key[idx]))

                #Update to next 
                idx = (idx+1)%1
            #Otherwise
            else:

                #Increment
                cipher += i

        #Return
        return cipher
    #Define main
    def main():

当我运行它时,它会要求我输入一条消息,但返回说在第 51 行有语法错误,在 <module> main() 和 第 38 行,在

main text = input("Type a message: /n"))
File "<string>", line 1

【问题讨论】:

您的输入中似乎多了一个" 语法高亮,就像这里使用的 Stack Overflow 一样,可以使这些类型的问题更加明显。在至少提供该功能的编辑器中工作(大多数都提供)可能是一个好主意。 这可能是因为您使用的是 Python 2,其中input 获取用户的输入并尝试评估它,就好像它是 Python 代码一样。如果不是,您将收到语法错误。您几乎不想使用该功能;使用raw_input(或升级到不存在该问题的Python 3)。 附带说明,如果您键入不是 ASCII 字母的字母,例如 éå,此代码可能会失败。在 Python 2 中,您可能会侥幸逃脱。在 Python 3 中,所有文本始终为 Unicode,isalpha 对于这些字母将是正确的,但它们在 ASCII 字母列表中的索引不是很有帮助。因此,您可能需要像 if i.lower() in alphabet_pos 这样的显式检查,或者可能不提前检查,而只是在 rotate 中编写处理 index 的代码,而 return letter 失败。 【参考方案1】:

不知道你为什么使用 main text = ... INSTEAD 而不是 text = ...main_text = ... 并且看起来你最后还有一个额外的括号......

所以,

如果您想从用户那里获取一个字符串并将其存储在一个变量text 中,您应该像这样重写您的语句:

如果您使用的是 Python3

text = input("Type a message: ")

如果您使用的是 Python2

text = raw_input("Type a message: ")

下次询问时请说明您使用的python版本,以便我们更容易回答:)

(你可以用import sys; print(sys.version)查看你运行的版本)

【讨论】:

以上是关于Vigenere 密码语法错误的主要内容,如果未能解决你的问题,请参考以下文章

cs50 的 Vigenere 密码程序错误

尝试加密/解密时出现 vigenere 密码错误

使用 vigenere 密码加密时出现奇怪的错误

CS50 PSet 2:Vigenere 密码分段错误

Python Vigenere 元组错误

Vigenere-cipher 错误输出