-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)使用することができます。alphabetalphaList

于 2012-10-01T16:38:13.017 に答える
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 に答える
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 に答える