Задать вопрос
Katawara
@Katawara

Что бы вы сказали об этом коде?

В качестве практики решила написать программу, которая шифрует и дешифрует пароли. В итоге все получилось (вот пара скринов работы),
Фото
Это шифрование 5c2e4e220e8c9265382157.jpegА это дешифрование5c2e4e19f3282032971901.jpegДа, выглядят фото так себе, но главное что видно, что все работает.
но мне хотелось бы узнать мнение о моём коде у более опытных питонистов. Помимо мнений, было бы интересно послушать и рекомендации по улучшению кода.
Собственно, сам код:
Тут код
def Mode(letter):		#функция обработки числа
	global mode
	if mode is True:
		j = letter * 2 - 9
	elif mode is False:
		j = (letter + 9) / 2
	return int(abs(j))

def rebuild_code(password):		#функция шифрования
	re_pass, pass_2_list = list(), list()
	for i in password:	#проход по чилам, обработка и добавление в re_pass
		letter = ord(i)
		j = Mode(letter)
		re_pass.append(j)
	for i in re_pass:
		pass_2_list.append(chr(i)) #перевод чисел в символы
	return "".join(pass_2_list)		#получение нового пороля

password = input('Введите пороль: ')
CorD = input("Выберите режим (Code/Decode): ")
if CorD.capitalize().startswith('Code'):
	mode = True
	print(rebuild_code(password))
elif CorD.capitalize().startswith('Decode'):
mode = False
	print(rebuild_code(password))
else:
	print('Вы ввели {}. Данного режима не существует.'.format(CorD))
Если так неудобно читать, можете посмотреть код и в виде фото.
5c2e52751efd5399822091.jpeg
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Простой 7 комментариев
Решения вопроса 2
@Andy_U
"if mode is True" - не надо так. Так же не надо называть целое число, как letter и очередной символ строки, как i,

Ну и алгоритм можно гораздо проще имплементировать:

from typing import Callable


def encode(code: int) -> int:
    """ Encode unicode code point of the character. """
    return code * 2 - 9


def decode(code: int) -> int:
    """ Decode unicode code point of the character. """
    return (code + 9) // 2


def process(password: str, func: Callable[[int], int]) -> str:
    """ Encode/decode password. """
    return ''.join([chr(abs(func(ord(c)))) for c in password])


if __name__ == '__main__':

    password = input('Введите пароль: ')
    mode = input("Выберите режим (Code/Decode): ").capitalize()

    if mode.startswith('Code'):
        print(process(password, encode))
    elif mode.startswith('Decode'):
        print(process(password, decode))
    else:
        print('Вы ввели {}. Данного режима не существует.'.format(mode))


Ну и наконец, одно большое "но". Маленькая буква "z" кодируется в "ё", а русские буквы вообще черт знает во что. Т.е. вместо правильного utf-символа Windows может напечатать знак вопроса в квадратике - т.е. признак непечатного символа.
Ответ написан
Рекомендую ознакомиться с данным документом https://pep8.ru/doc/pep8/
Рекомендую использовать какой-либо плагин linter для вашей ide - так будете уверены, что код соответствует определенным стандартам. Хотябы, тому же pep8. Мне сильно помогло улучшить культуру кода.

В частности, рекомендации по именованию переменных и функций.
По коду - rebuild_code работает двойным проходом - зачем? Можно сразу же преобразовывать и join-ить строку.

P. S. Не Питонист. Заметил то, в чем сам изначально ошибался.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы