遇到def行时脚本停止执行

时间:2019-06-27 10:24:19

标签: python python-3.x function encryption

因此,我有2个脚本,一个Vigenere密码和一个Caesar密码,但是,当我决定在发送用户想要的答案后,决定使用“导入”将它们合并到“ mainproject”文件中,以导入脚本在终端页面上,当我完成代码并决定执行mainproject时,我遇到的问题是选择使用Vigenere还是Caesar,一旦我键入caesar(1),它将播放前2-4行,我在两个脚本中都遇到“ def”行时停止了代码,如果那是问题,我不能将导入与“ def”一起使用,如何将它们都合并到一个文件中,询问我想要哪个脚本使用?

凯撒:

import time
import sys

print("Welcome to Caesar Cipher")
time.sleep(3)
print("Choose the corresponding number to Encrypt or Decrypt in Caesar Cipher")
def encryption():
    print("Encryption")

    print("You have chose ENCRYPTION")
    msg = input("Enter message: ")
    key = int(input("Enter key(0-25): "))  

    encrypted_text = ""

    for i in range(len(msg)):
        if ord(msg[i]) == 32:  
            encrypted_text += chr(ord(msg[i]))  

        elif ord(msg[i]) + key > 122:

            temp = (ord(msg[i]) + key) - 122   
            encrypted_text += chr(96+temp)

        elif (ord(msg[i]) + key > 90) and (ord(msg[i]) <= 96):

            temp = (ord(msg[i]) + key) - 90
            encrypted_text += chr(64+temp)

        else:

            encrypted_text += chr(ord(msg[i]) + key)

    print("Your Encrypted Message: " + encrypted_text)


def decryption():
    print("Decryption")

    print("You have chose DECRYPTION")
    encrp_msg = input("Enter encrypted Text: ")
    decrp_key = int(input("Enter key(0-25): "))

    decrypted_text = ""

    for i in range(len(encrp_msg)):
        if ord(encrp_msg[i]) == 32:
            decrypted_text += chr(ord(encrp_msg[i]))

        elif ((ord(encrp_msg[i]) - decrp_key) < 97) and ((ord(encrp_msg[i]) - decrp_key) > 90):
            temp = (ord(encrp_msg[i]) - decrp_key) + 26
            decrypted_text += chr(temp)

        elif (ord(encrp_msg[i]) - decrp_key) < 65:
            temp = (ord(encrp_msg[i]) - decrp_key) + 26
            decrypted_text += chr(temp)

        else:
            decrypted_text += chr(ord(encrp_msg[i]) - decrp_key)

    print("Text has been Decrypted: " + decrypted_text)


    choice = int(input("1. Encryption\n2. Decryption\nChoose(1,2): "))
    if choice == 1:
        encryption()
    elif choice == 2:
        decryption()
    else:
        print("Wrong Choice")

Vigenere:

import time
print("Welcome to Vigenere Cipher")
time.sleep(2)
print("Choose the corresponding number to Encrypt or Decrypt in Vigenere Cipher")
time.sleep(2.5)
def msg_and_key():
    msg = input("Enter message: ").upper()
    key = input("Enter key: ").upper()

    key_map = ""

    j=0
    for i in range(len(msg)):
        if ord(msg[i]) == 32:
            key_map += " "
        else:
            if j < len(key):
                key_map += key[j]
                j += 1
            else:
                j = 0
                key_map += key[j]
                j += 1

    return msg, key_map


def create_vigenere_table():
    table = []
    for i in range(26):
        table.append([])

    for row in range(26):
        for column in range(26):
            if (row + 65) + column > 90:

                table[row].append(chr((row+65) + column - 26))
            else:
                table[row].append(chr((row+65)+column))


    return table


def cipher_encryption(message, mapped_key):
    table = create_vigenere_table()
    encrypted_text = ""

    for i in range(len(message)):
        if message[i] == chr(32):
            encrypted_text += " "
        else:
            row = ord(message[i])-65
            column = ord(mapped_key[i]) - 65
            encrypted_text += table[row][column]

    print("Encrypted Message: {}".format(encrypted_text))


def itr_count(mapped_key, message):
    counter = 0
    result = ""

    for i in range(26):
        if mapped_key + i > 90:
            result += chr(mapped_key+(i-26))
        else:
            result += chr(mapped_key+i)

    for i in range(len(result)):
        if result[i] == chr(message):
            break
        else:
            counter += 1

    return counter


def cipher_decryption(message, mapped_key):
    table = create_vigenere_table()
    decrypted_text = ""


    for i in range(len(message)):
        if message[i] == chr(32):
            decrypted_text += " "
        else:
            decrypted_text += chr(65 + itr_count(ord(mapped_key[i]), ord(message[i])))

    print("Decrypted Message: {}".format(decrypted_text))


    print("Key and Message can only be alphabetic")
    time.sleep(1.5)
    choice = int(input("1. Encryption\n2. Decryption\nChoose(1,2): "))
    if choice == 1:
        print("You have chose ENCRYPTION")
        message, mapped_key = msg_and_key()
        cipher_encryption(message, mapped_key)

    elif choice == 2:
        print("You have chose DECRYPTION")
        message, mapped_key = msg_and_key()
        cipher_decryption(message, mapped_key)

    else:
        print("Wrong choice")

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

def定义一个函数。要真正执行它,您需要调用它。

以下部分似乎应该位于decryption函数主体的外面,即向左缩进。它:

  • 调用直接在模块级别执行
  • 可以是一个单独的函数,例如main可以打电话

main

def main():
    choice = int(input("1. Encryption\n2. Decryption\nChoose(1,2): "))
    if choice == 1:
        encryption()
    elif choice == 2:
        decryption()
    else:
        print("Wrong Choice")

现在您可以调用main函数:

main()

答案 1 :(得分:0)

欢迎使用Stackoverflow。这个答案最终更多地是作为一般性建议,而不是针对您问题的具体解决方案,但我希望它会有所帮助。

一个明显的说法是,不必为您不打算使用的密码导入代码将是很好的。 导入是可执行语句,因此非常实用。

您的代码远非最佳组织。这两个文件上的许多代码是相同或非常相似的。对于新程序员来说,这并不罕见,因为要花一些时间来学习如何分解问题并提取常见元素。真正的问题是,尽管它定义了许多函数,但实际上没有一个函数被调用(除非您没有包含更多代码)。

我建议您修改代码,以便有一个顶级程序来收集密钥和数据并执行所需的操作,以及您的两个 加密/解密模块。加密和解密例程完全不应该进行任何输入或输出,而只是处理数据。

让我们假设您有一个变量mtype,其中包含您要使用的加密类型。顶层逻辑可能看起来像这样:

if mtype == "caesar":
    from caesar import encrypt, decrypt
elif mtype == "vigniere":
    from vigniere import encrypt, decrypt
else:
    sys.exit("Unrecognised message type")

如果此代码成功,您将在正确的模块中拥有encryptdecrypt函数。这意味着它们必须具有相同的接口,因为现在必须编写您的逻辑以容纳两者之一。

其余逻辑看起来像这样(未经测试):

operation = input("E(ncrypt) or D(ecrypt)? ")
if operation.upper().startswith("E"):
    function = encrypt
elif operation.upper().startswith("D"):
    function = decrypt
else:
    sys.exit("Unknown operation")
message = input(...)
key = input(...)

output = function(message, key)

通过分离I / O职责,希望可以使代码更清晰 来自加密和解密任务。