Цезарь Сайфер Заглавная буква в питоне - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь закодировать Цезаря Сайфера, но он работает только со строчными буквами, и я пытаюсь заставить его напечатать исходные заглавные буквы.

def encrypt(message, key):
    alphabet_lower = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    if type(message) == str and type(key) == int:
        Letters = message.lower()
        LowerLetters = list(Letters)
        BacktoStr = []
        for i in LowerLetters:
            if i.strip() and i in alphabet_lower:
                BacktoStr.append(alphabet_lower[(alphabet_lower.index(i) + key) % 26])
            else:
                BacktoStr.append(i)
        FinalEncrypt = "".join(BacktoStr)
        return(FinalEncrypt)

    else:
        return("Invalid Input")

Когда я запускаю код, например: encrypt("Hello world",12)

Я получаю правильный вывод, но он в нижнем регистре. 'tqxxa iadxp'

Как получить заглавные буквы, чтобы они оставались заглавными, когда я возвращаю вывод? Использование python 3.7.0

1 Ответ

0 голосов
/ 12 сентября 2018

Вы не хотите сразу писать строчные буквы целиком, иначе вы потеряете информацию о заглавных буквах внутри цикла.(Можно обойти это, но это требует другого цикла или изменения в том, как вы выполняете итерацию.)

Существует две основные стратегии:

  1. Не позволяйте alphabet_lowerобрабатывать заглавные буквы.Сделайте alphabet_upper и сравните свои i с обоими.
  2. После изменения буквы проверьте, была ли оригинальная буква заглавной.Если это так, введите новую букву в верхнем регистре.

Улучшения alphabet_lower:

  1. Вы создаете alphabet_lower каждый раз, когда вызывается функция.Вместо этого вы можете сделать ее глобальной переменной, чтобы она создавалась только один раз.
  2. Поскольку вы используете только alphabet_lower для проверки наличия в нем символа, вы можете использовать строку вместо списка:'abcdefghijklmnopqrstuvwxyz'.Это может быть или не быть быстрее, но это, безусловно, легче читать, и это сейчас важнее.(Позже вы узнаете, если вы хотите проверить, входит ли вещь в большой список вещей, что set или dict могут быть более эффективными.)
  3. Вместо того, чтобы создавать собственный список строчных букв, вы можете import string и использовать string.ascii_lowercase.
  4. Чтобы получить индекс буквы, вы можете сделатьchr(letter) - chr('a') или chr(letter) - chr('A'), в зависимости от того, является ли он прописным или строчным.
  5. Вместо того, чтобы составлять список букв, вы можете поставить галочку i.lower() != i.upper().Номера для букв не будут прописными или строчными, поэтому для них i.lower() == i.upper().
  6. Наконец, вот простой и читаемый способ проверки букв: if 'a' <= i <= 'z':.

Будьте осторожны: эти методы предполагают ASCII.Если ваши входные данные, возможно, содержат общий Unicode (например, «á»), вы должны узнать, выполняют ли эти методы то, что, по вашему мнению, они делают.

Протестируйте небольшие фрагменты каждого метода, чтобы убедиться, что вы понимаете, что делает каждая часть.

Другие улучшения:

  1. Строки Python являются итеративными, поэтому вам не нужно превращать их в список.for i in Letters будет работать так же хорошо.
  2. Вам не нужно проверять if i.strip(), потому что i всегда будет одним символом (опять же, при условии ASCII).
  3. return не является функцией.Напишите return x, а не return(x).
  4. В Python заглавные имена, такие как Letters, обычно используются для классов, а не для обычных объектов. Вот полуофициальное руководство по стилю Python.
...