带字符串和循环Python的Caesar密码算法

带字符串和循环Python的Caesar密码算法,python,Python,任务是编写一个Caesar密码算法,该算法接收两个参数,第一个是字符串参数,第二个告诉字母表移位的距离。第一部分是设置一个方法并设置两个字符串,一个正常字符串和一个移位字符串。我已经这样做了。然后我需要做一个循环,通过查找原始字母并从移位的字符串中选择适当的新字母,遍历原始字符串以构建新字符串。我已经花了至少两个小时盯着这个,并且和我的老师谈过,所以我知道我在做一些正确的事情。但是关于while循环中的内容,我真的不知道。在正确的方向上的任何提示或推动都会非常有帮助,所以我至少有一个开始的地方会

任务是编写一个Caesar密码算法,该算法接收两个参数,第一个是字符串参数,第二个告诉字母表移位的距离。第一部分是设置一个方法并设置两个字符串,一个正常字符串和一个移位字符串。我已经这样做了。然后我需要做一个循环,通过查找原始字母并从移位的字符串中选择适当的新字母,遍历原始字符串以构建新字符串。我已经花了至少两个小时盯着这个,并且和我的老师谈过,所以我知道我在做一些正确的事情。但是关于while循环中的内容,我真的不知道。在正确的方向上的任何提示或推动都会非常有帮助,所以我至少有一个开始的地方会很好,谢谢

def cipher(x, dist):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    shifted = "xyzabcdefghijklmnopqrstuvw"
    stringspot = 0
    shiftspot = (x.find("a"))
    aspot = (x.find("a"))
    while stringspot < 26:
        aspot = shifted(dist)
        shifted = 
        stringspot = stringspot + 1
        ans = 
    return ans

print(cipher("abcdef", 1))
print(cipher("abcdef", 2))
print(cipher("abcdef", 3))
print(cipher("dogcatpig", 1))
def密码(x,dist):
alphabet=“abcdefghijklmnopqrstuvxyz”
移位=“xyzabcdefghijklmnopqrstuv”
stringspot=0
shiftspot=(x.find(“a”))
aspot=(x.find(“a”))
当stringspot<26时:
aspot=移位(距离)
移位=
stringspot=stringspot+1
ans=
返回ans
打印(密码(“abcdef”,1))
打印(密码(“abcdef”,2))
打印(密码(“abcdef”,3))
打印(密码(“dogcatpig”,1))

以下是一些推送和提示:


  • 你应该验证你的输入。特别是,确保换档距离是“合理的”,其中“合理”是指您可以处理的事情。我建议
    字母表
    移位
    应该是原始流和密文之间的映射。循环的工作是迭代流中的所有字母。更具体地说,
    字母表中的字母
    中的替代字母移位
    位于同一索引中,因此映射。在伪代码中:

    ciphertext = empty
    for each letter in x
        i = index of letter in alphabet
        new_letter = shifted[i]
        add new_letter to ciphertext
    
    整个循环可以简化为一个理解列表,但这不应该是您主要关心的问题

    要获得比上述伪代码更直接的映射,请查看字典


    代码中另一件突出的事情是
    移位
    的生成,它应该取决于参数
    dist
    ,因此不能只是硬编码。因此,如果
    dist
    为5,则移位的
    中的第一个字母应该是
    字母表中0+5处的任何字母,依此类推。提示:模运算符。

    您应该在未获得的while循环的部分内使用debug,类似于
    debug=True def log(s):如果debug:print s
    ,则在循环内使用log(“some string”)`注意:您已手动设置
    移位
    ,但是字符串应该根据
    dist
    参数的不同而有所不同。如果
    dist
    为1,
    shift
    应以a
    b
    开头。您应该动态构建
    shift
    。此外,如果以后使用圆括号(好像它是一个函数)的
    移位
    ,则应该使用方括号。另外,
    x
    不能包含字母
    a
    ,例如
    密码(“lol”,1)
    ,该密码应返回
    “mpm”
    。此外,while循环重复26次。然而,迭代
    x
    的每个字母(可能比26短/朗格)是合理的,因此这可能是您应该更改的内容。我建议您尝试手动解决某些情况(例如,当
    x
    为1个字母长时会发生什么?如果
    dist
    等于0时会发生什么?)
    ord()
    的结果不是任意的,但您可以将其称为对10秒钟内未查看ascii代码的人不敏感的结果。我还认为,将此功能引入游戏更令人讨厌。没有什么比他的
    字母表
    字符串或
    字符串.ascii_小写字母
    更简单的了。