긴 Python 코드를 리팩토링하는 방법

WBOY
풀어 주다: 2023-05-20 21:11:30
앞으로
709명이 탐색했습니다.

1. for 루프를 목록/사전/집합 표현식으로 변환

우리가 자주 접하는 상황은 값 집합을 만드는 것입니다.

예를 들어, 3차 숫자 목록을 만들고 반복적으로 채울 수 있습니다. 대부분의 언어에서 표준 방법은 다음과 같습니다.

cubes = []
for i in range(20):
    cubes.append(i ** 3)
로그인 후 복사

Python에서는 목록 표현식을 사용하여 필요한 데이터를 생성할 수 있습니다. 목록 정의와 지루한 채우기 작업을 피하기 위해 이 코드를 한 줄로 압축할 수 있습니다.

cubes = [i ** 3 for i in range(20)]
로그인 후 복사

보세요, 세 줄의 코드를 한 줄로 변환했는데, 이는 의심할 여지 없이 좋은 선택입니다. 눈으로 코드를 위, 아래, 왼쪽, 오른쪽으로 확인할 필요가 없습니다.

코드를 한 줄로 압축하면 읽기가 더 어려워지지만 파생 표현식에는 적용되지 않습니다. 구문에 익숙해지면 필요한 모든 요소가 매우 명확하게 표시되므로 for 루프 버전보다 읽기가 더 쉽습니다.

또 다른 요점은 할당이 이제 원자 연산과 비슷하다는 것입니다. 큐브를 만드는 방법에 대한 지침을 제공하기보다는 큐브가 무엇인지 선언합니다. 이렇게 하면 변수 큐브가 어떻게 구성되는지보다는 변수 큐브가 의미하는 바에 초점을 맞추기 때문에 코드를 더 쉽게 읽을 수 있습니다.

마지막으로 표현식은 루프에서 컬렉션을 구축하는 것보다 빠른 경우가 많습니다. 이는 성능을 고려할 때 중요한 요소이기도 합니다.

2. 할당을 증분 할당으로 대체

증분 할당은 빠르고 간단한 Python 구문입니다.

언제든지 다음과 같은 코드가 있습니다:

count = count + other_value
로그인 후 복사

는 다음 코드로 대체될 수 있습니다:

count += other_value
로그인 후 복사

코드는 짧고 명확합니다. 계산 변수에 대해 두 번 생각할 필요가 없습니다. 마이너스 같음(-=), 비트 AND 같음(&=), 나누기 같음(/=), 곱하기 같음(*=) 등 몇 가지 연산자도 사용할 수 있습니다.

할당하는 유형에는 적절한 연산자가 정의되어 있어야 하므로 주의가 필요합니다. 예를 들어, numpy 배열은 /= 작업을 지원하지 않습니다.

3. 한 번만 사용되는 인라인 변수

사람들의 코드에서 흔히 볼 수 있는 상황은 결과를 임시 변수에 할당한 후 즉시 반환하는 것입니다.

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은 추가 정보를 제공하지 않습니다. 따라서 결과를 임시 변수에 할당할 필요가 없습니다.

4. if 문을 if 표현식으로 대체

변수를 두 가지 다른 값 중 하나로 설정하려는 상황이 자주 발생합니다.

if condition:
    x = 1
else:
    x = 2
로그인 후 복사

이것은 Python의 조건식 구문(파이썬의 삼항 연산자 버전)을 사용하여 한 줄에 작성할 수 있습니다.

x = 1 if condition else 2
로그인 후 복사

이것은 확실히 더 간결하지만 논란의 여지가 있는 리팩토링입니다(목록 표현식과 마찬가지로). 일부 프로그래머는 if 문에 조건 전체를 작성하는 것보다 이해하기 어렵다는 이유로 이 표현식을 싫어합니다.

이러한 개선은 조건식을 짧게 하고 조합할 수 있는 경우 효율성을 높일 수 있다고 생각합니다. 목록 표현식 예와 유사하게 코드를 읽을 때 일반적으로 x가 어떻게 할당되는지 알 필요가 없으며 x가 할당된 다음 앞으로 나아가는 것만 볼 수 있습니다.

5. 원치 않는 표현식을 생성기로 대체

간단한 문장으로 변환: 집합 대신 생성기를 매개변수로 사용하는 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'
로그인 후 복사

6. 조건을 반환 문으로 단순화합니다.

마지막으로 소개된 리팩토링 기술은 함수가 결과를 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿