파이썬의 놀라운 언어 기능을 탐색하기 시작한 지 꽤 시간이 지났습니다. 처음에는 다른 프로그래밍 언어로 프로그래밍 경험을 쌓았을 때보다 더 많은 Python 언어 기능을 연습할 수 있다는 목표로 스스로에게 도전했습니다. 이것은 일을 점점 더 흥미롭게 만듭니다! 코드는 점점 더 간결해지고, 코드는 더욱 구조화되고 표준화되어 보입니다. 아래에서 그 혜택을 소개하겠습니다.
for 루프는 일반적으로 다음 사용 시나리오에서 사용됩니다.
다행히 Python에는 이미 이 작업을 수행하는 데 도움이 되는 많은 도구가 있습니다. 마음을 바꾸고 다른 관점에서 생각해 보면 됩니다.
for 루프 작성을 피함으로써 얻을 수 있는 이점:
아래 코드 구조를 살펴보겠습니다.
# 1 with ...: for ...: if ...: try: except: else:
이 예에서는 읽기 어려운 여러 수준의 중첩 코드를 다루고 있습니다. 이 예에서는 여러 수준의 중첩 코드를 사용합니다. 이 코드에서 내가 발견한 것은 관리 논리(with, try-Exception)와 비즈니스 논리(for, if)를 혼합하기 위해 들여쓰기를 무분별하게 사용했다는 것입니다. 관리 논리에 들여쓰기만 사용하는 규칙을 준수한다면 핵심 비즈니스 논리는 즉시 제거해야 합니다.
기존 도구를 사용하여 for 루프를 대체할 수 있습니다
간단한 예를 살펴보겠습니다. 하나의 배열을 다른 배열로 변환하고 싶다면:
result = [] for item in item_list: new_item = do_something_with(item) result.append(item)
MapReduce를 좋아한다면, map이나 Python의 List Comprehension을 사용할 수도 있습니다:
result = [do_something_with(item) for item in item_list]
마찬가지로, 만약 당신이 배열에서
요소에 대해서만 반복하려는 경우 동일한 코드 생성기 표현식을 사용할 수도 있습니다.
result = (do_something_with(item) for item in item_list)
배열을 다른 배열에 매핑하려면 map 함수를 호출하면 보다 발전되고 실용적인 프로그래밍 방식으로 이 문제를 해결할 수 있습니다.
doubled_list = map(lambda x: x * 2, old_list)
시퀀스를 하나로 줄이려면 Reduce를 사용하세요
from functools import reduce summation = reduce(lambda x, y: x + y, numbers)
또한 많은 Python 내장 함수는 iterable을 사용합니다:
>>> a = list(range(10)) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> all(a) False >>> any(a) True >>> max(a) 9 >>> min(a) 0 >>> list(filter(bool, a)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> set(a) {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} >>> dict(zip(a,a)) {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9} >>> sorted(a, reverse=True) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] >>> str(a) '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' >>> sum(a) 45
위의 두 가지 방법이 더 다루기 쉽습니다. 논리. 좀 더 복잡한 논리는 어떻습니까? 프로그래머로서 우리는 복잡한 비즈니스를 추상화하는 함수를 작성합니다. 동일한 아이디어가 여기에 적용됩니다. 다음과 같이 작성했다면:
results = [] for item in item_list: # setups # condition # processing # calculation results.append(result)
분명히 코드 블록에 너무 많은 책임을 추가하고 있는 것입니다. 대신에 다음을 제안합니다:
def process_item(item): # setups # condition # processing # calculation return result results = [process_item(item) for item in item_list]
중첩 함수로 변경하면 어떻게 될까요
results = [] for i in range(10): for j in range(i): results.append((i, j))
List Comprehension으로 변경하고 구현은 다음과 같습니다.
results = [(i, j) for i in range(10) for j in range(i)]
코드 블록이 일부 내부 상태를 기록해야 하는 경우
# finding the max prior to the current item a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] results = [] current_max = 0 for i in a: current_max = max(i, current_max) results.append(current_max) # results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
우리는 다음을 사용합니다. 생성기를 달성하려면:
def max_generator(numbers): current_max = 0 for i in numbers: current_max = max(i, current_max) yield current_max a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] results = list(max_generator(a))
직접 작성하지 마세요. itertools는 이 모듈을 구현하는 것은 매우 간단합니다. 대부분의 시나리오에서 이 모듈이 원본 for 루프를 대체할 수 있다고 생각합니다. 예를 들어 마지막 예는 다음과 같이 다시 작성할 수 있습니다.
from itertools import accumulate a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] resutls = list(accumulate(a, max))
또한 결합된 시퀀스를 반복하려면 product(), permutations(), Combinations()를 사용해야 합니다.
결론
대부분의 경우 for 루프를 작성할 필요가 없습니다.위 내용은 과제: Python에서 루프 구현에 대한 대안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!