2014-10-22 56 views
-2

當我最後一個問題中的一個沒有得到很好的回答後,我決定考慮這個問題的所有答案(對吧?)。一個困擾我的是定義/調用一個簡單的函數。如何定義這些功能?

我明白主要想法,並且可以在小(簡單)的範圍內完成。例如:

def multiply(x, y): 
    return x*y 

numb1 = 2 
numb2 = 3 

print(multiply(numb1, numb2)) 

很簡單。現在我想要做的是通過定義函數來清理我的Vigenere密碼,並且困擾我的是什麼參數以及爲什麼。我不想改變(可能寫得不好,不開心)代碼,但我只想看看在使用定義的函數後它會如何看待它。

message = input("Enter a message to encrypt:\n").upper().replace(" ", "") 
print("Enter your encryption key ("+str(len(message)),"or less letters.): ") 
key = input().upper().replace(" ", "") 
div_times = int(int(len(message))/int(len(key))) 
remainder = int(len(message))%int(len(key)) 
key_ring = (((key)*(div_times+1))[:-(len(key)-remainder)]) 
alph = 26 

print("-------\n" 
     "Message: ",message,"\n" 
     "Key:  ",key_ring, 
     "\n-------") 
mvalues = [0]*len(message) 
kvalues = [0]*len(key_ring) 
m_position = 0 
k_position = 0 

for letter in message: 
    mvalues[m_position] = ord(letter) 
    m_position += 1 

for key in key_ring: 
    num = alph - (int(ord("Z")) - int(ord(key))) 
    kvalues[k_position] = num - 1 
    k_position += 1 

m_position = 0 
k_position = 0 
print("\nEncrypted message: ", end="") 
for character in message: 
    newletter_v = (mvalues[m_position] + kvalues[k_position]) 
    if newletter_v > ord("Z"): 
     newletter_v -= 26 
    elif newletter_v < ord("A"): 
     newletter_v += 26 
    print(chr(newletter_v)+"", end="") 
    m_position += 1 
    k_position += 1 

我試過的東西結合,我不斷收到錯誤或不正確的輸出:

def encryptMessage(message, key): 
    mvalues = [0]*len(message) 
    kvalues = [0]*len(key_ring) 
    m_position = 0 
    k_position = 0 
    for letter in message: 
     mvalues[m_position] = ord(letter) 
     m_position += 1 

    for key in key_ring: 
     num = alph - (int(ord("Z")) - int(ord(key))) 
     kvalues[k_position] = num - 1 
     k_position += 1 


message = input("Enter a message to encrypt:\n").upper().replace(" ", "") 
print("Enter your encryption key ("+str(len(message)),"or less letters.): ") 
key = input().upper().replace(" ", "") 
div_times = int(int(len(message))/int(len(key))) 
remainder = int(len(message))%int(len(key)) 
key_ring = (((key)*(div_times+1))[:-(len(key)-remainder)]) 
alph = 26 

print("-------\n" 
     "Message: ",message,"\n" 
     "Key:  ",key_ring, 
     "\n-------") 
mvalues = [0]*len(message) 
kvalues = [0]*len(key_ring) 
m_position = 0 
k_position = 0 

encryptMessage(message, key) 

m_position = 0 
k_position = 0 
print("\nEncrypted message: ", end="") 
for character in message: 
    newletter_v = (mvalues[m_position] + kvalues[k_position]) 
    if newletter_v > ord("Z"): 
     newletter_v -= 26 
    elif newletter_v < ord("A"): 
     newletter_v += 26 
    print(chr(newletter_v)+"", end="") 
    m_position += 1 
    k_position += 1 

回答

0

我能給出的最好的建議是在其方面一直認爲一個功能輸入輸出

參數是輸入,函數返回的是輸出。在您的密碼的情況下,想什麼可以改變(和需要,而不是那些總是相同的事情將要提供) - 這是輸入:

  • 消息加密
  • 加密關鍵

你可以寫聲明的功能,然後在體內填充:

def encrypt(message, encryptionKey): 
    """encrypts message using vignere cipher""" 
    # TO DO in here perform encryption to produce 
    # the return variable encryptedMessage... 
    return encryptedMessage 

在定義函數時總是試圖拿東西很可能在程序中多次使用並封裝它。通過創建函數encrypt,您可以重複執行該操作,但只能編寫一次代碼。這是DRY原則 - 它代表D on't R epeat Y我們自己。