> 백엔드 개발 > 파이썬 튜토리얼 > Elixir의 For 루프와 컴프리헨션 - 명령형 코드 변환

Elixir의 For 루프와 컴프리헨션 - 명령형 코드 변환

Linda Hamilton
풀어 주다: 2024-12-04 15:05:11
원래의
172명이 탐색했습니다.

For loops and comprehensions in Elixir - transforming imperative code

이 글에서는 Python에서 for 루프와 컴프리헨션의 몇 가지 일반적인 용도, 기존 루프를 분석하는 방법, Elixir에서 이를 동등한 표현식으로 변환하는 방법을 다룹니다. Enum 모듈과 컴프리헨션의 함수를 사용합니다.

우리가 집중할 내용은 다음과 같습니다.

  • 함수()을 통해 데이터 모음 변환
  • 컬렉션 안팎으로 값 필터링(필터)
  • 평균(줄이기 또는 접기)
  • 와 같은 단일 집계 값 또는 구조 생성

이 세 가지를 모두 합친 기본 예시로 마무리하겠습니다!

파이썬

For 루프

Python에서 for 루프는 일반적으로 인터리브 처리를 특징으로 합니다. 즉, 단계가 동일한 절이나 본문으로 함께 결합됩니다. 다음은 처음 두 개의 짝수를 제곱하는 예입니다.

result = 0
for num in [1, 2, 3, 4, 5]:
    if num % 2 == 0:
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 인터리브된 본문의 한 가지 과제는 다음과 같습니다.

  1. 각 단계를 식별하고…
  2. 어떤 단계인지 알아보세요.

각 단계를 분리하면 발생하는 변환을 이해하고, 불필요한 변환을 제거하고, 해당 단계를 다른 언어 구조나 더 높은 수준의 기능으로 다시 작성할 수 있습니다.

위 함수에 주석을 달면 다음과 같은 결과가 나옵니다.

result = 0
for num in [1, 2, 3, 4, 5]:
    ## Filter
    if num % 2 == 0:
        ## Reduce (result += ) and Map (num ** 2)
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

단계

결과적으로 단계 순서는 다음과 같습니다.

  1. 필터 홀수 "아웃"/짝수 "안"
  2. 매핑 숫자(예: 2)를 해당 제곱수(예: 4)로
  3. 짝수를 제곱한 합으로 줄입니다

이해

Python의

컴프리헨션은 목록이나 사전과 같은 컬렉션을 매핑하고 필터하는 간단한 방법입니다. 결과를 감소하는 방법은 제공하지 않지만 sum과 같은 내장 함수를 사용하여 위의 내용을 변환하여 이해 결과를 처리할 수 있습니다.

result = sum(num ** 2 for num in [1, 2, 3, 4, 5] if num % 2 == 0)
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사

컴프리헨션을 사용하여 표현식은 map 단계(num ** 2)와 filter 단계(if num % 2)를 나눕니다. == 0) 명확합니다. sum은 reduce 단계입니다.

Python에서는 이러한 이해 표현식을 훑어보기가 쉬우며 이해의 복잡성에 유용한 상한선을 설정합니다.

이러한 배경 지식과 Python 처리 구조의 구조와 한계에 대한 더 나은 이해를 바탕으로 Elixir의 이해력과 Enum 파이프라인을 사용하여 위의 Python 코드를 다시 작성해 보겠습니다!

매핑: Enum.map 및 생성기

스텝을 제곱수로 어떻게 쓸 수 있나요? Elixir에서는 간단합니다!

Enum.map 사용:

result = 0
for num in [1, 2, 3, 4, 5]:
    if num % 2 == 0:
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

그리고 이해력 사용(for):

result = 0
for num in [1, 2, 3, 4, 5]:
    ## Filter
    if num % 2 == 0:
        ## Reduce (result += ) and Map (num ** 2)
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

<-는 generator 표현식을 나타내며 do:

뒤에 for 표현식의 본문에 사용할 값을 생성합니다.

필터링: Enum.filter 및 필터

Enum.filter(또는 Enum.reject)를 사용하면 쉽게 수행할 수 있습니다.

result = sum(num ** 2 for num in [1, 2, 3, 4, 5] if num % 2 == 0)
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사

홀수를 제곱하기 전에 필터링해야 하므로 파이프라인의 올바른 위치인 Enum.map 앞에 배치합니다.

컴프리헨션을 사용하면 컴프리헨션의 머리 부분에 부울 테스트인 필터라는 두 번째 표현식을 추가할 수 있습니다.

Enum.map([1, 2, 3, 4, 5], & &1 ** 2)
로그인 후 복사

rem(n, 2) == 0 표현식은 false(또는 nil)를 반환하는 모든 요소를 ​​삭제하고 [2, 4]를 본문에 실제로 전달되는 숫자로 남겨둡니다(do: n ** 2). 이해력이 좋습니다.

감소 -> Enum.reduce 및 축소:

Enum.reduce/2를 사용하면 누산기에 추가하여 제곱 숫자 목록을 합계로 변환할 수 있습니다. 누산기의 초기 값(Enum.reduce/3)을 지정하지 않은 경우 첫 번째 요소는 누산기의 초기 값으로 사용되며, 여기에서 유용합니다.

for n <- [1, 2, 3, 4, 5], do: n ** 2
로그인 후 복사

이해력을 사용하면 Python에 상응하는 것보다 훨씬 더 강력한 기능을 사용할 수 있습니다. 헤드에 다른 절을 추가하여 축소 단계를 추가할 수 있습니다.

[1, 2, 3, 4, 5]
|> Enum.filter(& rem(&1, 2) == 0)
|> Enum.map(& &1 ** 2)
로그인 후 복사

여기에서 두 가지 사항을 변경합니다.

  1. 초기값이 0인 값을 누적하도록 지정하기 위해 헤드에 Reduce: 0 절을 추가합니다.
  2. 현재 제곱 값을 더할 수 있는 Acc 값(누산기)을 캡처하기 위해 for 본문을 변경합니다.

내장 함수: Enum.sum

일반적으로 변환하려는 데이터는 가능한 최고 수준의 방식으로 표현되어야 합니다. Enum.reduce를 가장 낮은 수준의 기능 변환으로 생각하면 유용합니다. 다른 모든 데이터 처리를 Enum.reduce로 다시 작성할 수 있기 때문입니다.

Enum 모듈에는 일반적으로 값 목록을 합계, 최대값 또는 최소값과 같은 단일 집계 값으로 줄이는 것과 관련된 다양한 상위 수준 함수가 포함되어 있습니다. 이 경우 요소의 합을 원합니다.

Enum 파이프라인의 경우 이는 간단합니다.

for n <- [1, 2, 3, 4, 5], rem(n, 2) == 0, do: n ** 2
로그인 후 복사

컴프리헨션에서 이러한 상위 수준 집계 함수를 표현할 방법이 없으므로 Python에서 했던 것과 유사하게 컴프리헨션의 출력을 Enum.sum 호출로 파이프할 수 있습니다.

[1, 2, 3, 4, 5]
|> Enum.filter(& rem(&1, 2) == 0)
|> Enum.map(& &1 ** 2)
|> Enum.reduce(& &1 + &2)
로그인 후 복사

일반적으로 다른 형식을 혼합하는 것은 피해야 합니다. 특히 변형이 단순한 경우 독자의 정신적 부담이 줄어들기 때문에 더욱 그렇습니다. 축소: 위의 형식은 실제로 낮은 수준에도 불구하고 읽기에 더 명확합니다.

어떤 Elixir 표현이 더 좋나요?

요약하자면 관용적이라고 생각될 수 있는 두 가지 형태로 끝났습니다. Enum 파이프라인의 경우:

result = 0
for num in [1, 2, 3, 4, 5]:
    if num % 2 == 0:
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

그리고 이해:

result = 0
for num in [1, 2, 3, 4, 5]:
    ## Filter
    if num % 2 == 0:
        ## Reduce (result += ) and Map (num ** 2)
        result += num ** 2
print(result)  # Output: 20
로그인 후 복사
로그인 후 복사
로그인 후 복사

읽기 쉬운 코드는 모호함이나 표현식에 문제가 없어 훑어보기가 쉬워야 합니다. 두 가지 양식 모두 다음과 같이 해당 기준을 충족한다고 생각합니다.

  1. Enum 파이프라인 또는 컴프리헨션 중 하나의 일관된 형식을 따릅니다
  2. 각 표현식은 단일 처리 단계에 해당합니다
  3. 위에서 아래로 또는 왼쪽에서 오른쪽으로 중단 없이 읽을 수 있습니다

결론

Elixir에서는 이러한 변환을 여러 가지 방법으로 작성할 수 있으며, 특히 코드가 변경되고 시간이 지남에 따라 처리가 더 복잡해지면 코드베이스의 스타일이 달라지기 쉽습니다.

PureType은 Enum 파이프라인과 이해력을 분석하여 가장 명확하고 관용적인 형식으로 표현함으로써 사용자의 선호도를 학습하고 팀의 다른 사람들이 코드의 가독성과 명확성을 높일 수 있습니다. 오늘 바로 사용해 보세요!

위 내용은 Elixir의 For 루프와 컴프리헨션 - 명령형 코드 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿