코드에 for 루프를 작성하지 않도록 도전해야 하는 이유는 무엇입니까? 왜냐하면 이로 인해 더 발전되고 더 관용적인 구문이나 라이브러리를 사용하는 방법을 배우게 되기 때문입니다. 이 기사에서는 Python을 예로 들어 모든 사람이 다른 사람의 코드에서 본 적이 있지만 스스로는 거의 사용하지 않는 많은 구문에 대해 이야기합니다.
파이썬의 놀라운 언어 기능을 탐색하기 시작한 지 꽤 오래되었습니다. 처음에는 다른 프로그래밍 언어로 프로그래밍 경험을 쌓았을 때보다 더 많은 Python 언어 기능을 연습하겠다는 목표로 스스로에게 도전했습니다. 이것은 일을 점점 더 흥미롭게 만듭니다! 코드는 점점 더 간결해지고, 코드는 더욱 구조화되고 표준화되어 보입니다. 아래에서 그 혜택을 소개하겠습니다.
For 루프는 일반적으로 다음 사용 시나리오에서 사용됩니다.
다행히 Python에는 이미 이 작업을 수행하는 데 도움이 되는 많은 도구가 있습니다. 마음을 바꾸고 다른 관점에서 생각해 보면 됩니다.
for 루프 작성을 피함으로써 얻을 수 있는 이점:
아래 코드 구조를 살펴보겠습니다.
# 1 with ...: for ...: if ...: try: except: else:
이 예에서는 읽기 어려운 여러 수준의 중첩 코드를 다루고 있습니다. 이 예에서는 여러 수준의 중첩 코드를 사용합니다. 이 코드에서 내가 발견한 것은 관리 로직(with, try-Exception)과 비즈니스 로직(for, if)을 혼합하기 위해 들여쓰기를 무분별하게 사용했다는 것입니다. 관리 논리에 들여쓰기만 사용하는 규칙을 준수한다면 핵심 비즈니스 논리는 즉시 제거해야 합니다.
"플랫 구조가 중첩 구조보다 낫다" - The Zen of Python
기존 도구를 사용하여 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]
마찬가지로 배열의 요소를 반복하려는 경우에도 마찬가지입니다. 가능합니다. Generator Expression과 동일한 코드를 사용하세요. result = (item_list의 항목에 대한 do_something_with(item))
배열을 다른 배열로 매핑하려면 map 함수를 호출하면 됩니다. 그러면 좀 더 발전되고 실용적인 프로그래밍 방법을 사용하여 문제를 해결할 수 있습니다. 문제.
doubled_list = map(lambda x: x * 2, old_list)
시퀀스를 하나로 줄이려면 Reduce를 사용하세요
또한 많은 Python 내장 함수는 반복 가능 함수를 사용합니다:
>>> 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]
us 이를 달성하려면 생성기를 사용하세요.
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))
독자가 "잠깐만요! 생성기에서 for 루프를 사용했군요, 부정행위군요! 걱정하지 마세요. 아래 코드를 보세요.
직접 작성하지 마세요. 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 루프를 작성할 필요가 없습니다.위 내용은 세 가지 옵션 | for 루프를 버리고 Python 코드를 더욱 파이썬적으로 만드세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!