>백엔드 개발 >파이썬 튜토리얼 >세 가지 옵션 | for 루프를 버리고 Python 코드를 더욱 파이썬적으로 만드세요!

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

WBOY
WBOY앞으로
2023-04-12 20:46:041444검색

세 가지 옵션 | 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으로 문의하시기 바랍니다. 삭제