-1

Caeser Cypher Part II - 好的,这是我上周工作的一个进步,现在需要制作一个完全工作的 ceasar cypher,它可以通过某个移位值来加密一个句子。我不知道下一步该怎么做..任何人都可以帮忙,还有为什么我在字母表第 19 行运行回溯错误,python 说我定义时没有定义“字母表”?

sentence = raw_input('Enter a sentence to be encrypted')
shift = input('Enter a shift value')

def createDict (shift):
    alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,'

alphaList=[]
for letter in alphabet:
    alphaList.append(letter)

alphaDict={}
for letter in alphaList:
    valueLetterIndex = (alphaList.index(letter) + shift)%len(alphaList)
    valueLetter = alphaList[valueLetterIndex]
    alphaDict[letter] = valueLetter
4

3 回答 3

2

alphabet您在函数内部创建了一个局部变量createDict(),但是...

  • 你永远不会调用这个函数
  • 即使您这样做了,alphabet也不会在您尝试访问它的全局范围内定义

尝试删除createDict函数定义并取消缩进alphabet定义行:

sentence = raw_input('Enter a sentence to be encrypted')
shift = input('Enter a shift value')

alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,'

alphaDict={}
for letter in alphabet:
    valueLetterIndex = (alphabet.index(letter) + shift)%len(alphabet)
    valueLetter = alphabet[valueLetterIndex]
    alphaDict[letter] = valueLetter

或者,也许您实际上打算将所有内容都包含在该函数中,在这种情况下,您需要为alphabet定义下方的所有内容添加一定程度的缩进。

作为旁注,您可以将您的alphaList构造简化为list(alphabet),或者只使用alphabet而不是alphaList按照凯文的建议。

于 2012-10-01T16:38:13.017 回答
1
def ceasar(s, n):
    # The characters in skipchars are not changed. Expand to your liking.
    skipchars = ' .,?/!@#$%^&*()[]{}'
    s = s.lower()
    t = ord('a')
    out = ''
    for c in s:
        if not c in skipchars:
            out += chr((ord(c)-t+n)%26 + t)
        else:
            out += c
    return out

为了测试它,我们使用 13 作为偏移量:

In [21]: ceasar('This is a test.', 13)
Out[21]: 'guvf vf n grfg.'

In [22]: ceasar('guvf vf n grfg.', 13)
Out[22]: 'this is a test.'

In [23]: 'guvf vf n grfg.'.encode('rot13')
Out[23]: 'this is a test.'
于 2012-10-01T18:45:57.787 回答
1

为什么要使用createDict()函数?这很奇怪。你根本不使用它。其次,我喜欢 iPython。这是非常宝贵的工具。

  6 
  7 alphaList=[]
----> 8 for letter in alphabet:
  9   alphaList.append(letter)
  10 

  NameError: name 'alphabet' is not defined

你现在看到了。我认为有一种更简单的方法可以做到这一点。您是否尝试过内置函数ord()chr()简单列表。

list = list('Your string')
text_to_encode = raw_input('Prompt') 
text_to_encode = list(text_to_encode)
for i in text_to_encode:
    in = (ord(text_to_encode)-65)
    code = (ord(text_to_encode)-65) 
    if in+code > 26:
        foo = code - in
        text_to_encode[i] = foo
    else:
        foo = code+in 

这只是伪代码。尝试类似的东西。这仅适用于小写字母。对于大写字母,您必须添加一些 elif。

于 2012-10-01T18:41:07.873 回答