Python beginn上的Cesar密码

2024-05-29 11:49:45 发布

您现在位置:Python中文网/ 问答频道 /正文

''' Cesar Cipher '''
def encrypt(word, shift):

    word = word.lower()

    for i in word:
        r = chr(ord(i)+shift)
        if r > "z":
            r = chr(ord(i) - 26 + shift)
        word = word.replace(i, r)

    return word

if __name__ == "__main__": print encrypt("programming", 3)

这给了我一个错误的答案,轮班高于1,单词长于2。我不明白为什么。有什么帮助吗?在


Tags: nameinforreturnifshiftdeflower
3条回答

我也有这个任务。提示是,您必须跟踪值的包装位置,并将其用于您的优势。我还建议使用upper函数调用,这样一切都是一样的,减少了要做的检查的次数。在

蒂洛准确地解释了这个问题。让我们一步一步来:

''' Cesar Cipher '''
def encrypt(word, shift):

    word = word.lower()

    for i in word:
        r = chr(ord(i)+shift)
        if r > "z":
            r = chr(ord(i) - 26 + shift)
        word = word.replace(i, r)

    return word

尝试encrypt('abc', 1)并查看会发生什么:

^{pr2}$

您不想将i的每个实例替换为r,只需要这一个。你会怎么做?好吧,如果你跟踪索引,你可以在那个索引处替换。内置的enumerate函数允许您同时获得每个索引和每个相应的值。在

for index, ch in enumerate(word):
    r = chr(ord(ch)+shift)
    if r > "z":
        r = chr(ord(ch) - 26 + shift)
    word = new_word_replacing_one_char(index, r)

现在您只需编写new_word_replacing_one_char函数,如果您知道切片,这是非常容易的。(如果您还没有学习切片,您可能需要将字符串转换为list字符,所以您只需说word[index] = r,然后在结尾处转换回字符串。)

我不知道Python如何喜欢在您迭代单词时替换单词中的字符,但是有一件事似乎肯定是一个问题,因为replace将替换字母的所有出现的,而不仅仅是您当前正在查看的字母,因此您最终会将这些重复的字母移动超过一次(当您在以后的迭代中再次命中它们时)。在

想想看,不重复的字母也会发生这种情况。例如,在三次迭代中,将ABC移1将变成->BBC->CCC->DDD。在

相关问题 更多 >

    热门问题