세 가지 옵션 | for 루프를 버리고 Python 코드를 더욱 파이썬적으로 만드세요!

WBOY
풀어 주다: 2023-04-12 20:46:04
앞으로
1327명이 탐색했습니다.

세 가지 옵션 | for 루프를 버리고 Python 코드를 더욱 파이썬적으로 만드세요!

코드에 for 루프를 작성하지 않도록 도전해야 하는 이유는 무엇입니까? 왜냐하면 이로 인해 더 발전되고 더 관용적인 구문이나 라이브러리를 사용하는 방법을 배우게 되기 때문입니다. 이 기사에서는 Python을 예로 들어 모든 사람이 다른 사람의 코드에서 본 적이 있지만 스스로는 거의 사용하지 않는 많은 구문에 대해 이야기합니다.

파이썬의 놀라운 언어 기능을 탐색하기 시작한 지 꽤 오래되었습니다. 처음에는 다른 프로그래밍 언어로 프로그래밍 경험을 쌓았을 때보다 더 많은 Python 언어 기능을 연습하겠다는 목표로 스스로에게 도전했습니다. 이것은 일을 점점 더 흥미롭게 만듭니다! 코드는 점점 더 간결해지고, 코드는 더욱 구조화되고 표준화되어 보입니다. 아래에서 그 혜택을 소개하겠습니다.

For 루프는 일반적으로 다음 사용 시나리오에서 사용됩니다.

  • 시퀀스에서 일부 정보를 추출합니다.
  • 다른 시퀀스에서 하나의 시퀀스를 생성합니다.
  • 글쓰기가 습관이 되었습니다.

다행히 Python에는 이미 이 작업을 수행하는 데 도움이 되는 많은 도구가 있습니다. 마음을 바꾸고 다른 관점에서 생각해 보면 됩니다.

for 루프 작성을 피함으로써 얻을 수 있는 이점:

  • 더 적은 양의 코드
  • 더 나은 코드 가독성
  • 더 적은 들여쓰기(여전히 Python의 경우 의미가 있음)

아래 코드 구조를 살펴보겠습니다.

# 1 with ...: for ...: if ...: try: except: else:
로그인 후 복사

이 예에서는 읽기 어려운 여러 수준의 중첩 코드를 다루고 있습니다. 이 예에서는 여러 수준의 중첩 코드를 사용합니다. 이 코드에서 내가 발견한 것은 관리 로직(with, try-Exception)과 비즈니스 로직(for, if)을 혼합하기 위해 들여쓰기를 무분별하게 사용했다는 것입니다. 관리 논리에 들여쓰기만 사용하는 규칙을 준수한다면 핵심 비즈니스 논리는 즉시 제거해야 합니다.

"플랫 구조가 중첩 구조보다 낫다" - The Zen of Python

기존 도구를 사용하여 for 루프를 대체할 수 있습니다

1. 목록 이해/생성기 표현식

간단한 예를 살펴보겠습니다. 한 배열을 다른 배열로 변환하려는 경우:

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))

2. Function

배열을 다른 배열로 매핑하려면 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
로그인 후 복사

3.Extract Functions or Generators

위의 두 가지 방법은 더 간단하게 처리하는 데 좋습니다. 논리 . 좀 더 복잡한 논리는 어떻습니까? 프로그래머로서 우리는 복잡한 비즈니스를 추상화하는 함수를 작성합니다. 동일한 아이디어가 여기에 적용됩니다. 다음과 같이 작성했다면:

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 루프를 작성하지 않는 것이 좋습니다. 섹스

위 내용은 세 가지 옵션 | for 루프를 버리고 Python 코드를 더욱 파이썬적으로 만드세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!