2016-09-20 2 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) for i in pass_lst]'예를 들어. 이렇게하면 초기화 할 필요가 없습니다. \ 또한 목록을 선언하십시오. 이 전체 기능은 4-5 줄로 압축 될 수 있습니다. –

+2

매개 변수의 값에 따라 완전히 다른 두 가지 기능 (이 경우에는 반대되는 기능)을 작성하지 마십시오. 'encrypt'와'decrypt' 함수 두 개를 쓰십시오. – chepner

+0

in_or_out == 'in'else chr (ord (i) - 10) 인 경우 'return' '.join ([chr (ord (i) + 10)]을 실제로 사용하면 한 줄로 응축됩니다. 목록 (데이터)])'읽을 수 있습니다. 나는한다. –

답변

1

in_or_out 매개 변수에서 ± 10을 계산하여 DRYer로 설정하십시오. 예,

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) 

그리고 그 지능형리스트를 사용하여 소형화 할 수있다 : 내가 직접 data 반복하고있어

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이 문자열, 목록 또는 튜플 인 경우 작동합니다.

그러나 코드는 안전하지 않습니다. ord(i) + delta이 0-255 범위 밖에있는 문자 코드는 처리하지 않습니다.

+0

아, 그 두 번째 것은 아름답습니다. 고마워. – Pyth0nicPenguin

1

일반적으로 함수는 하나의 가지를 사용해야합니다. 두 함수를 하나로 결합한 다음 "내장"함수가 실제로 실행되는 인수를 사용하여 반 패턴을 만듭니다. 당신은 (PM 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 함수로 채우기를 원하지 않습니다.

(비록 일지라도을 조합해도 두 가지 용어 집합을 사용하지 말고 "암호화"/ "해독"또는 "입/출력"중 하나를 선택하고 두 기능 이름과 값은 인수에 전달할)

당신이 정말로, 사전에 두 가지 기능을 저장 암호화 사이에서 선택하고 매개 변수의 값에 따라 해독해야하는 경우.

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

d[in_or_out](value) 
관련 문제