2016-12-15 59 views
0

我有一個問題關於下面這段代碼:的Python鍛鍊的V @ genere代碼

ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

def main(): 
encrypt_code = codeer('NOBODY EXPECTS THE SPANISH INQUISITION!', 'CIRCUS') 
print("{}".format(encrypt_code)) 
print("{}".format(decrypt('CIRCUS', encrypt_code))) 

def codeer(tekst, sleutel): 
pairs = zip(tekst, cycle(sleutel)) 
code = "" 

for pair in pairs: 
    total = reduce(lambda x, y: ALPHA.index(x) + ALPHA.index(y), pair) 
    code += ALPHA[total % 26] 

return code; 

該代碼會崩潰,因爲該郵件包含一個空白和一個!標誌。

total = reduce(lambda x, y: ALPHA.index(x) + ALPHA.index(y), pair) ValueError: substring not found

任何人可以幫助我與我的問題

以下是預期輸出的一個例子:

codeer('NOBODY EXPECTS THE SPANISH INQUISITION!', 'CIRCUS') 
'PWSQXQ MORYUVA VBW AGCHAUP KHIWQJKNAQV!' 

decodeer('PWSQXQ MORYUVA VBW AGCHAUP KHIWQJKNAQV!', 'CIRCUS') 
'NOBODY EXPECTS THE SPANISH INQUISITION!' 
+0

使用['find()'](https://docs.python.org/2/library/string.html#string.find)避免引發錯誤? (雖然這會給你錯誤的結果,我猜) – UnholySheep

+0

你應該解釋什麼是預期的輸出和行爲 - 例如:什麼應該與空白和感嘆號字符發生? – UnholySheep

+0

你好,我目前使用查找字符中存在的字符,但是,我得到以下異常: TypeError:並非在字符串格式化期間轉換的所有參數 – Michael

回答

0

在我看來,所有你需要做的是隻編碼/解碼當有問題的角色是大寫字母時。請參閱下面的例子,瞭解我的想法。

def codeer(tekst, sleutel): 
    pairs = zip(tekst, cycle(sleutel)) 
    code = "" 

    for pair in pairs: 
     if pair[0].isupper(): 
      total = reduce(lambda x, y: ALPHA.index(x) + ALPHA.index(y), pair) 
      code += ALPHA[total % 26] 
     else: 
      code += pair[1] 
    return code 

您可能會注意到它的執行here。它似乎產生了所需的輸出。

+0

@Michael它們是相同的。唯一的區別是前導和尾隨單引號,如果它們非常重要,可以將它們連接起來。我是否錯過了其他不同的東西? – ilim

+0

@Michael你在你的問題中提供的代碼不包含函數decodeer,這就是爲什麼我的響應中包含的ideone鏈接沒有在main()函數中調用解碼器。如果您可以將解碼器的代碼添加到您的問題中,我可以修改我的答案以包含對解碼器的修改,這與編碼器非常相似。 – ilim