우리가 자주 접하는 상황은 값 집합을 만드는 것입니다.
예를 들어, 3차 숫자 목록을 만들고 반복적으로 채울 수 있습니다. 대부분의 언어에서 표준 방법은 다음과 같습니다.
cubes = [] for i in range(20): cubes.append(i ** 3)
Python에서는 목록 표현식을 사용하여 필요한 데이터를 생성할 수 있습니다. 목록 정의와 지루한 채우기 작업을 피하기 위해 이 코드를 한 줄로 압축할 수 있습니다.
cubes = [i ** 3 for i in range(20)]
보세요, 세 줄의 코드를 한 줄로 변환했는데, 이는 의심할 여지 없이 좋은 선택입니다. 눈으로 코드를 위, 아래, 왼쪽, 오른쪽으로 확인할 필요가 없습니다.
코드를 한 줄로 압축하면 읽기가 더 어려워지지만 파생 표현식에는 적용되지 않습니다. 구문에 익숙해지면 필요한 모든 요소가 매우 명확하게 표시되므로 for 루프 버전보다 읽기가 더 쉽습니다.
또 다른 요점은 할당이 이제 원자 연산과 비슷하다는 것입니다. 큐브를 만드는 방법에 대한 지침을 제공하기보다는 큐브가 무엇인지 선언합니다. 이렇게 하면 변수 큐브가 어떻게 구성되는지보다는 변수 큐브가 의미하는 바에 초점을 맞추기 때문에 코드를 더 쉽게 읽을 수 있습니다.
마지막으로 표현식은 루프에서 컬렉션을 구축하는 것보다 빠른 경우가 많습니다. 이는 성능을 고려할 때 중요한 요소이기도 합니다.
증분 할당은 빠르고 간단한 Python 구문입니다.
언제든지 다음과 같은 코드가 있습니다:
count = count + other_value
는 다음 코드로 대체될 수 있습니다:
count += other_value
코드는 짧고 명확합니다. 계산 변수에 대해 두 번 생각할 필요가 없습니다. 마이너스 같음(-=), 비트 AND 같음(&=), 나누기 같음(/=), 곱하기 같음(*=) 등 몇 가지 연산자도 사용할 수 있습니다.
할당하는 유형에는 적절한 연산자가 정의되어 있어야 하므로 주의가 필요합니다. 예를 들어, numpy 배열은 /= 작업을 지원하지 않습니다.
사람들의 코드에서 흔히 볼 수 있는 상황은 결과를 임시 변수에 할당한 후 즉시 반환하는 것입니다.
def state_attributes(self): """Return the state attributes.""" state_attr = { ATTR_CODE_FORMAT: self.code_format, ATTR_CHANGED_BY: self.changed_by, } return state_attr
실제로 결과를 저장하기 위해 임시 변수를 사용하는 대신 결과를 직접 반환하는 것이 더 좋은 방법입니다
def state_attributes(self): """Return the state attributes.""" return { ATTR_CODE_FORMAT: self.code_format, ATTR_CHANGED_BY: self.changed_by, }
이렇게 하면 코드가 단축되고 불필요한 변수를 삭제하여 코드를 읽는 정신적 소모를 줄일 수 있습니다.
임시 변수는 매개변수나 조건으로 사용될 때 유용할 수 있으며 이름은 해당 내용을 반영합니다. 위의 예에서는 state 속성만 반환되며 state_attr은 추가 정보를 제공하지 않습니다. 따라서 결과를 임시 변수에 할당할 필요가 없습니다.
변수를 두 가지 다른 값 중 하나로 설정하려는 상황이 자주 발생합니다.
if condition: x = 1 else: x = 2
이것은 Python의 조건식 구문(파이썬의 삼항 연산자 버전)을 사용하여 한 줄에 작성할 수 있습니다.
x = 1 if condition else 2
이것은 확실히 더 간결하지만 논란의 여지가 있는 리팩토링입니다(목록 표현식과 마찬가지로). 일부 프로그래머는 if 문에 조건 전체를 작성하는 것보다 이해하기 어렵다는 이유로 이 표현식을 싫어합니다.
이러한 개선은 조건식을 짧게 하고 조합할 수 있는 경우 효율성을 높일 수 있다고 생각합니다. 목록 표현식 예와 유사하게 코드를 읽을 때 일반적으로 x가 어떻게 할당되는지 알 필요가 없으며 x가 할당된 다음 앞으로 나아가는 것만 볼 수 있습니다.
간단한 문장으로 변환: 집합 대신 생성기를 매개변수로 사용하는 any, all, sum과 같은 함수를 사용할 수 있습니다. 즉,
hat_found = any([is_hat(item) for item in wardrobe])
대신 다음과 같이 코드를 변경할 수 있습니다.
hat_found = any(is_hat(item) for item in wardrobe)
이렇게 하면 괄호 쌍이 제거되어 코드가 약간 더 명확해집니다. any 함수가 결과를 찾으면 전체 목록을 작성할 필요 없이 즉시 반환됩니다. 이는 성능 향상으로 이어질 수 있습니다.
실제로 생성기를 any()에 전달하고 있다는 점에 유의하세요. 엄밀히 말하면 코드는 다음과 같아야 합니다.
hat_found = any(is_hat(item) for item in wardrobe)
하지만 Python에서는 이 괄호 쌍을 생략할 수 있습니다. 다음은 생성기를 허용하는 표준 라이브러리 함수입니다.
'all', 'any', 'enumerate', 'frozenset', 'list', 'max', 'min', 'set', 'sum', 'tuple'로그인 후 복사
마지막으로 소개된 리팩토링 기술은 함수가 결과를 True 또는 False로 반환해야 한다는 것입니다. 일반적인 접근 방식은 다음과 같습니다.
def function(): if isinstance(a, b) or issubclass(b, a): return True return False
그러나 아래와 같이 결과를 직접 반환하는 것이 더 간결합니다.
def function(): return isinstance(a, b) or issubclass(b, a)
이는 표현식이 부울 값으로 평가되는 경우에만 수행할 수 있습니다. 예를 들어,
def any_hats(): hats = [item for item in wardrobe if is_hat(item)] if hats or self.wearing_hat(): return True return False
예제에서는 bool()을 사용하여 hat과 self.wearing_hat()을 bool 목록으로 결합하여 if 조건을 제거하고 프로그램을 단순화할 수 있습니다.
아아아아위 내용은 긴 Python 코드를 리팩토링하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!