2016-09-20 3 views
1

У меня есть эта основная функция шифрования:Сделать основную функцию шифра более читаемым

def encrypt_decrypt(data, in_or_out): 
    pass_lst = list(data) 
    return_list = [] 

    if in_or_out == "in": 
     for i in pass_lst: 
      num = ord(i) + 10 
      return_list.append(chr(num)) 
    else: 
     for i in pass_lst: 
      num = ord(i) - 10 
      return_list.append(chr(num)) 

    return ''.join(return_list) 

Я хочу сделать этот шифр немного более читаемым и немного DRY ээ .. Есть ли способ, что я могу сократить эту функцию успешно ?

+0

список использование постижений например: 'return_list = [chr (ord (i) + 10) для i в pass_lst]' например. Таким образом, вам не нужно инициализировать \ declare списки тоже. Вся эта функция может быть сжата в 4-5 строках. –

+2

Не записывайте одну функцию, которая выполняет две совершенно разные (и в этом случае противоположные) вещи, основанные на значении параметра. Вместо этого запишите две функции 'encrypt' и' decrypt'. – chepner

+0

На самом деле он конденсируется в одну строку, если вы считаете это: 'return '.join ([chr (ord (i) + 10), если in_or_out ==' in 'else chr (ord (i) - 10) для i в список (данные)]) 'читаемый. Я делаю. –

ответ

1

Вы можете сделать это DRYer, вычислив ± 10 из параметра in_or_out. Например,

def encrypt_decrypt(data, in_or_out): 
    delta = {'in': 10, 'out': -10}[in_or_out] 
    return_list = [] 
    for i in list(data): 
     num = ord(i) + delta 
     return_list.append(chr(num)) 
    return ''.join(return_list) 

И что можно сделать более компактным, используя список понимание:

def encrypt_decrypt(data, in_or_out): 
    delta = {'in': 10, 'out': -10}[in_or_out] 
    return ''.join([chr(ord(i) + delta) for i in data]) 

Обратите внимание, что я непосредственно итерация data. Это будет работать, если data - это строка, список или кортеж.

Однако вы должны знать, что ваш код небезопасен: он не обрабатывает коды символов, где ord(i) + delta находится за пределами диапазона 0-255.

+0

О, мужчина, этот второй красивый. Спасибо вам за это – Pyth0nicPenguin

1

Как правило, функции должны выполнять один вещь; объединяя две функции в одну, а затем используя аргумент для запуска какой-либо «встроенной» функции на самом деле, это немного антипаттерн. Вы можете все еще абстрактными из общего кода (здесь, следуя определению П.М. 2Ring в):

def encrypt(data): 
    return _modify(data, 10) 

def decrypt(data): 
    return _modify(data, -10) 

def _modify(data, delta): 
    return ''.join([chr(ord(i) + delta) for i in data]) 

В общем, вашей паре функций не будет это симметрично, хотя, и это будет не так легко реализовать как с точки зрения одной четкой функции. В этом случае вы определенно не хотите, чтобы наполнить обе реализации одной функцией encrypt_or_decrypt.

(Даже если вы do объедините их, не используйте два отдельных набора терминов. Выберите один из «зашифрованных»/«дешифрованных» или «in»/«out» и придерживайтесь его как для функции имя и значение для передачи аргумента)

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

d = {"encrypt": encrypt, "decrypt": decrypt} 

d[in_or_out](value) 
Смежные вопросы