为什么我的caeser密码只打印字符串的最后一个字母?蟒蛇

时间:2017-01-11 09:01:09

标签: python algorithm

def caesar_cipher(offset, string):
    words = string.replace(" ", " ")
    cipher_chars = "abcdefghijklmnopqrstuvwxyz"
    word_i = 0
    while word_i < len(words): 
        word = words[word_i]

        letter_i = 0 
        while letter_i < len(word): 
            char_i = ord(word[letter_i]) - ord("c")
            new_char_i = (char_i + offset) % 26
            value = chr(new_char_i + ord("c"))
            letter_i += 1
        word_i += 1

    return words.join(value)
print caesar_cipher(3, "abc")

嘿大家,出于某种原因,我的ceasar密码只打印我的字符串中的最后一个字母,当我想要它来加密整个字符串时,例如,如果我用字符串打印3的偏移量&#34; abc&# 34;它应该打印def,而只是打印f。任何帮助是极大的赞赏!

1 个答案:

答案 0 :(得分:2)

value在循环中被覆盖。您想创建一个传递给join的列表(ATM只加入1个字符):

value = []

然后

value.append(chr(new_char_i + ord("c")))

join语句也是错误的:只需执行:

return "".join(value)

请注意,您的代码中还有其他问题。它似乎打算处理几个单词,但它没有,所以很多循环不循环(没有单词列表,它只是一个单词),所以你正在做的事情可以归纳为(使用一个简单的列表理解):

def caesar_cipher(offset, string):
    return "".join([chr((ord(letter) - ord("c") + offset) % 26 + ord("c")) for letter in string])

和一句话:

print(" ".join([caesar_cipher(3, w) for w in "a full sentence".split()]))

作为一名优秀的评论者指出,使用c作为起始字母是不正确的,因为它会删除包含最后3个字母的句子。没有理由不以a开头(其余字母的结果相同):

def caesar_cipher(offset, string):
    return "".join([chr((ord(letter) - ord("a") + offset) % 26 + ord("a")) for letter in string])

除此之外:快速类似的算法是rot13。不是真正的密码,但它原生支持:

import codecs
print(codecs.encode("a full sentence","rot13"))

(应用于编码的字符串进行解码)