Простой Цезаря и deshift


Я написал эту программу, чтобы сделать простой сдвиг Цезаря введенного ключа пользователя, а затем deshift. Мне очень нравится, но у меня кончились идеи по улучшению! Можете ли вы думать ни о чем?

def decrypt():
    a=raw_input("Give me the word to decrypt:")
    number=input("What was it shifted by?")
    b=list(a)
    str(b)
    c=[ord(x)for x in(b)]
    d=[]
    for i in c:
        d.append(i-number)
    e=[chr(i) for i in (d)]
    e="".join(e)
    print "Decryption Successful, your word is",e,"!"

def encrypt():
    a=raw_input("Give me a word:")
    number=input("Give me a number:")
    b=list(a)
    str(b)
    c=[ord(x)for x in(b)]
    d=[]
    for i in c:
        d.append(i+number)
    e=[chr(i) for i in (d)]
    e="".join(e)
    print "Your Caesar shifted result (ascii code) is:",e,"!"
    print "Your key is", number, ",remember that!"

def menu():    
    print "\n\n\nWelcome to the Caesar Shifter."
    print "What would you like to do?"
    print "Option 1:Encrypt Word"
    print "Option 2:Decrypt Word"
    print "If you would like to quit, press 0."
    choice=input("Pick your selection:")
    if choice==1:
        run=encrypt()
        run
        menu()
    elif choice==2:
        derun=decrypt()
        derun
        menu()
    elif choice==0:
        quit
    else:
        print"That is not a correct selection, please pick either 1, or 2."

menu()


3427
14
задан 29 июня 2011 в 06:06 Источник Поделиться
Комментарии
2 ответа

Это может быть не совсем то, что у вас на уме, но одно большое улучшение, которое вы могли бы использовать осмысленные имена переменных и вставить пробел.

def decrypt():
cyphertext = raw_input('Give me the word to decrypt:')
shift = input('What was it shifted by?')

cypher_chars = list(cyphertext)
str(b) # this does nothing; you should remove it
cypher_ords = [ord(x) for x in cypher_list]
plaintext_ords = []
for i in cypher_ords:
plaintext_ords.append(i - shift)

plaintext_chars = [chr(i) for i in plaintext_ords]
plaintext = ''.join(plaintext_chars)
print 'Decryption Successful, your word is', plaintext, '!'

Конечно вы могли бы сжимать сильно это в один-лайнер. Но для нового программиста, я предлагаю придерживаться читаемые имена переменных, которые дают понять, что происходит.

Еще, вы могли бы сделать, что при сжатии код немного:

def decrypt():
cyphertext = raw_input('Give me the word to decrypt:')
shift = input('What was it shifted by?')

cypher_ords = [ord(x) for x in cyphertext]
plaintext_ords = [o - shift for o in cypher_ords]
plaintext_chars = [chr(i) for i in plaintext_ords]
plaintext = ''.join(plaintext_chars)
print 'Decryption Successful, your word is', plaintext, '!'

8
ответ дан 29 июня 2011 в 06:06 Источник Поделиться

Я рекомендую против использования ввод. Ввода позволяет пользователю вводить произвольные выражения языка Python, который является не то, что вы хотите. Вместо того, чтобы использовать тип int(raw_input()) , чтобы получить число от пользователя.

1
ответ дан 30 июня 2011 в 07:06 Источник Поделиться