【问题标题】:Code Caesar python代码凯撒蟒
【发布时间】:2018-01-29 21:57:26
【问题描述】:

我正在尝试在 Python 中创建一个简单的 Caesar Cipher 函数,该函数根据用户的输入转换字母并在末尾创建一个最终的新字符串。问题是最终的密文仅显示最后一个移位字符,而不是具有所有移位字符的整个字符串,并且例如当字母 z 时,程序不会在字母表的开头重新启动 PS我受过法语教育,所以有些台词可能是法语 这是我的代码:

list=list()
r=0
choix=int(input("Veuillez entrer 1 pour coder ou 2 pour decoder"))
if choix==1 :
    cle=int(input("Quelle est votre clé?"))
    phrase=input("Quelle est votre phrase? ")
    for i in phrase :
        r=ord(i)
        r=(r+cle)%26
        lettre=chr(r)
        list.append(lettre)
    print(list)
elif choix==2 :
    cle=int(input("Quelle est votre clé?"))
    phrase=input("Quelle est votre phrase? ")
    for i in phrase :
       r=ord(i)
       r=(r-cle)%26
       lettre=chr(r)
       list.append(lettre)
    print(list)

【问题讨论】:

  • 调整使用者list comme nom de variable。 En effet, il s'agit d'un nom déjà utilisé comme nom de fonction et de type de données。
  • 你是print(lettre)而不是list进行编码。你正在用你自己的列表覆盖内置的listlist=list.append(lettre)list 设置为 None。它应该只是list.append(lettre)。查看欺骗目标。
  • 您的代码充满了问题。您需要分解问题并确保一次只做一件事情。
  • 虽然您的代码部分是用法语编写的,但 cmets 应该是英语。如果您想用法语交流,请找到一个大声的网站。选择 1:您没有将输出附加到“lettre”,因此您只会得到 list_lettre 中的最后一个。

标签: python caesar-cipher


【解决方案1】:

好吧,请耐心等待,我只有第一部分(编码),但我认为您可以完成其余的工作:

code=list()
choix=int(input("Veuillez entrer 1 pour coder ou 2 pour decoder"))
if choix==1 :
    cle=int(input("Quelle est votre clé?"))
    phrase=input("Quelle est votre phrase? ")
    for el in phrase:
        if el.islower():
            r = ((ord(el) - ord('a')) + cle) % 26 + ord('a')
            code.append(chr(r))
        elif el.isupper():
            r = ((ord(el) - ord('A')) + cle) % 26 + ord('A')
            code.append(chr(r))
        else:
            code.append(el)

    print(code)

这里的棘手部分是:((ord(el) - ord('a')) + cle) % 26 + ord('a'),因为你想遍历小写字母,你必须将你的计算限制在ord('a')ord('z') 之间,即97ord('z') 之间。正如@Malvolio 建议的那样使用模数,“重新启动”。

【讨论】:

  • @TemporalWolf 已编辑以删除任何列表理解。
  • 显然我晚上的主题是滥用。当它不是列表推导时,它是 ord()。感谢您的反馈。
  • 值得注意的是,这只适用于小写字符。
【解决方案2】:

这是一个移位密码函数,可以帮助您入门。

def shift_cipher(phrase, shift):
    '''Ceaser Ciphers/Unciphers a string'''
    alphabet = list(string.ascii_lowercase)

    phrase = str(phrase)
    phrase = phrase.lower()
    new_phrase = ''
    for letter in phrase:
        shift_letter_index = alphabet.index(letter) + shift
        new_phrase += alphabet[shift_letter_index % 26]

    return new_phrase

【讨论】:

  • 为什么不使用string 模块中的ascii_lowercase 属性来填充您的字母表而不是手写呢?比如alphabet = list(string.ascii_lowercase)?
  • 因为我是从旧文件中复制的,没想到。这是个好建议。
【解决方案3】:

几点:

  • 你实际上并没有问你的问题。有什么问题?
  • 您创建了liste_lettre,但您从未对它做任何事情。
  • “重启”(英文通常称为“wrap”)的方式是使用modulus。 Python(和大多数编程语言)中的模数符号是%

【讨论】:

  • “进入”呢?这是一个编码问题。正如您所注意到的,表达式chr(ord(c)+13) 不能正确换行,但chr(ord(a) + ((ord(c) + 13 - ord(a)) % 26)) 会。
  • 提前付款。
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 2020-05-31
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2011-07-11
  • 2014-03-07
相关资源
最近更新 更多