>  기사  >  백엔드 개발  >  과제: Python에서 루프 구현에 대한 대안

과제: Python에서 루프 구현에 대한 대안

WBOY
WBOY앞으로
2023-05-07 09:28:071155검색

挑战不再写Python for 循环

파이썬의 놀라운 언어 기능을 탐색하기 시작한 지 꽤 시간이 지났습니다. 처음에는 다른 프로그래밍 언어로 프로그래밍 경험을 쌓았을 때보다 더 많은 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]

마찬가지로, 만약 당신이 배열에서

요소에 대해서만 반복하려는 경우 동일한 코드 생성기 표현식을 사용할 수도 있습니다.

result = (do_something_with(item) for item in item_list)

2. Function

배열을 다른 배열에 매핑하려면 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

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]

우리는 다음을 사용합니다. 생성기를 달성하려면:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제