2014-10-22 57 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我们自己。