이 글에서는 Python에서 for 루프와 컴프리헨션의 몇 가지 일반적인 용도, 기존 루프를 분석하는 방법, Elixir에서 이를 동등한 표현식으로 변환하는 방법을 다룹니다. Enum 모듈과 컴프리헨션의 함수를 사용합니다.
우리가 집중할 내용은 다음과 같습니다.
이 세 가지를 모두 합친 기본 예시로 마무리하겠습니다!
Python에서 for 루프는 일반적으로 인터리브 처리를 특징으로 합니다. 즉, 단계가 동일한 절이나 본문으로 함께 결합됩니다. 다음은 처음 두 개의 짝수를 제곱하는 예입니다.
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
결과적으로 단계 순서는 다음과 같습니다.
컴프리헨션은 목록이나 사전과 같은 컬렉션을 매핑하고 필터하는 간단한 방법입니다. 결과를 감소하는 방법은 제공하지 않지만 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 코드를 다시 작성해 보겠습니다!
스텝을 제곱수로 어떻게 쓸 수 있나요? 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.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/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)
여기에서 두 가지 사항을 변경합니다.
일반적으로 변환하려는 데이터는 가능한 최고 수준의 방식으로 표현되어야 합니다. 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)
일반적으로 다른 형식을 혼합하는 것은 피해야 합니다. 특히 변형이 단순한 경우 독자의 정신적 부담이 줄어들기 때문에 더욱 그렇습니다. 축소: 위의 형식은 실제로 낮은 수준에도 불구하고 읽기에 더 명확합니다.
요약하자면 관용적이라고 생각될 수 있는 두 가지 형태로 끝났습니다. 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
읽기 쉬운 코드는 모호함이나 표현식에 문제가 없어 훑어보기가 쉬워야 합니다. 두 가지 양식 모두 다음과 같이 해당 기준을 충족한다고 생각합니다.
Elixir에서는 이러한 변환을 여러 가지 방법으로 작성할 수 있으며, 특히 코드가 변경되고 시간이 지남에 따라 처리가 더 복잡해지면 코드베이스의 스타일이 달라지기 쉽습니다.
PureType은 Enum 파이프라인과 이해력을 분석하여 가장 명확하고 관용적인 형식으로 표현함으로써 사용자의 선호도를 학습하고 팀의 다른 사람들이 코드의 가독성과 명확성을 높일 수 있습니다. 오늘 바로 사용해 보세요!
위 내용은 Elixir의 For 루프와 컴프리헨션 - 명령형 코드 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!