2012-10-01 70 views
-1

Caeser密碼第二部分 - 好吧,這是一個從上週的工作爲我的一個級別的工作的進步,現在需要做一個完全可以工作的ceasar密碼,可以通過一定的移位值來加密句子。林不知道下一步該怎麼做..任何人都可以幫助,也是爲什麼我在字母表行19上運行追溯錯誤,python說'字母'沒有定義當我定義它?Ceasar密碼第2部分

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 
+0

請添加有關你的錯誤的詳細信息。 – 2012-10-01 16:36:16

+1

沒有定義。你在一個函數中定義了它,然後試圖在函數之外訪問它。也許你的縮進是錯誤的。 – korylprince

+0

看看我最後一個問題的答案。它做你想要的。 – korylprince

回答

2

您創建了一個局部變量alphabetcreateDict()函數內,但是......

  • 你永遠不調用這個函數
  • 即使你做到了,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凱文的建議。

+1

作爲他側面提示的一個備註,你根本不需要'alphaList'。字符串支持迭代,'index'和'len'與列表相同,所以只需使用'alphabet'。 – Kevin

+0

接下來我該怎麼辦呢im confused – user1655562

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 

這只是僞代碼。 嘗試類似的東西。 這隻適用於小寫字母。對於大寫字母,您必須添加少量elifs。

+0

但是我們不允許使用ord和chr函數呢 – user1655562

1
def ceasar(s, n): 
    # The characters in skipchars are not changed. Expand to your liking. 
    skipchars = ' .,?/[email protected]#$%^&*()[]{}' 
    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.' 
+0

什麼?我現在很困惑 – user1655562