목차들어가며리스트 요소들 전체의 합은 Show 리스트 요소들 끼리의 곱은 구해지지가 않는다. 그래서 해당 방법에 대해 알아보자. 총 3가지의 종류가 있다.
for 문 수행하기
eval 함수와 join 메소드 사용하기
eval 함수에 대해서 잘 모른다면 다음 포스팅을 참고하면 됩니다. [Python] eval() / exec() 함수로 문자열을 파이썬 코드로 실행하기 reduce 함수 사용하기
reduce 함수에 대해서 잘 모른다면 다음 포스팅을 참고하면 됩니다. [Python] reduce 함수 사용 방법 Reference더 자세하게 알고 싶다면 Reference를 참고하면 됩니다. 들어가며대부분의 프로그래밍 언어에서 ‘배열’을 내장하고 있다. 확실히 프로그래밍 입문 책을 보면 가장 먼저 접하는 자료구조 중 하나가 배열로, C나 자바 등은 논의를 원소를 실수로만 갖는 배열로 한정하고 생각해보자. 파이썬에는 배열의 합을 구하는
더없이 단순한 코드로 파이썬을 조금이라도 배워본 사람들은 이해하는 코드다. 그런데, 내가 문제삼고 싶은 것은 파이썬에 배열의 합을 구하는 함수는 있는데, 배열의 곱을 구하는 내장함수는 없다는 것이다. 하지만 결국은 없고, 그러면 우리가 한번 만들어보자. 원소의 곱을 구하는 기능을 만드는 것은 그리 어려운 것은 아니다. 하지만 하나의 문제를 푸는 방법이 한 가지인 경우는 별로 없고, 기본적인 방식과 파이썬에서 제공하는 다른 기능들을 활용해서도 다양하게 구현해볼 수 있다. 그래서 이 포스트에서는 파이썬에서 배열의 곱을 구하는 기능을 3가지 방법으로 해보도록 하자. 배열 안의 원소는 모두 실수라고 가정한다. 1. 기본적인 구현먼저 다른 언어들에서도 흔히 구현할 수 있는 방법으로 구현해보자.
곱을 구하는 일반적인 코드다. 반복문과 조건문은 어느 언어에나 있기 때문에 이 기본적인 statement를 사용해 값을 구한다. 다만 배열 안에 0이 있을 때는 언제나 결과가 0이기 때문에 그것을 검사하는 코드를 선택적으로 추가했다. 이번에는 좀 덜 보편적인, 그러니까 보다 Pythonic한 방법으로 풀어보도록 하자. 2. reduce를 통한 방법함수형 프로그래밍(functional programming)에는
음… 이게 무슨 말인가 싶다. 내가 한 문장으로 정의하면 ‘fold(reduce)는 주어진 순회가능한 자료구조에 원소 각각에 차례로 연산을 해나가면서 최종적으로 단 하나의 반환값만을 내뱉는 기능이나 용어를 말한다.’ 말로 하면 어려운데, 이를 그림으로 보면 좀더 이해가 쉽다.
그림의 오른쪽 부분을 해석하면 아까 곱을 구하는 첫 번째 방법과 일맥상통하지 않은가? 코드를 다시 살펴보자.
이 함수는 1(z)라는 초기값에 arr의 원소를 하나씩 주어진 함수(여기서는 곱하기)로 처리한 뒤 최종 결과물 ans로 반환한다. 이와 같이 재귀적 자료구조에 위와 같은 처리를 해 하나의 단일 값으로 반환하는 것을 바로 이 방법을 통해 곱을 구해보자.
언제나 헬핑(helping)을 생활화해야 한다.
그리고 우리의 예제에서 단일 값을 반환하는 계산 순서는 이를 파이썬 코드로 구현하면 다음과 같다.
음, 여기서 처음 보는
그리고 따라서 위의
위 두 함수가 하는 기능은 완벽히 똑같다. 그렇다면 왜 reduce의 인자로 def가 아닌 lambda를 굳이 썼을까? 그 이유는 편리성에 있다.
먼저, lambda를 쓰면 단 한 줄로 함수를 정의할 수 있다.
또 결정적으로, 익명 함수는 이름이 없는 함수로, 함수에 이름을 지정할 필요가 없을 때 쓸 수 있는데 파이썬에서 익명함수를 정의하는 예약어는 우리는 함수를 왜 쓸까? 함수 사용의 장점은 여러 가지가 있지만 그중에는 코드의 재사용성을 높인다는 장점이 있다. 하지만 이름이 필요하지 않은 경우도 있다. 우리의 저 이와 같이 1회용으로 간단하게 함수를 인자로 넣어야 할 때 익명함수의 활용은 함수형 프로그래밍의 대표적인 기능인 멀리 돌아왔는데 결국 저 3. eval과 str.join을 활용한 방법이 방법은 진정 Pythonic한 방법이다. 다른 언어에서 이렇게 풀 수 있을지 모르겠다. 이 둘에 대해 각각 설명하면 다음과 같다. eval메타프로그래밍(Metaprogramming)이란 개념이 있다. 위키피디아에서는 이 개념을 ‘컴퓨터 프로그램이 다른 프로그램을 자신의 데이터처럼 취급하는 능력이 있게 만드는 프로그래밍 기법’이라고 설명하고 있다. 우리가 일상적으로 코딩하는 환경에서는 내가 최종적으로 프로그램 코드를 전부 작성하는데, 메타프로그래밍은 이와 달리 코드 작성의 일부를 컴퓨터에 위임하는 것을 말한다. 파이썬에서는 메타프로그래밍을 지원하는 내장함수를
이 함수를 간단하게 사용해보자.
우리의 예제에서 저 문자열은 평가(evaluate) 가능한 수식으로, 값은 120이다. 저렇게 원소 사이를 ‘*‘로 채운 뒤, 값을 평가하면 배열 내 원소의 곱을 구할 수 있을 것이다. 이렇게 평가하는 도구가 그러면 다음으로 배열을 받아서 그 원소 사이에 ‘*‘를 끼워 문자열로 출력하는 기능만 있으면 되는데, str.join내장
보는 바와 같이 str.join은 받은 리스트 사이에 자신을 끼워넣어 문자열을 만들어 반환한다. 바로 구현하자! 구현
길이는 원래 배열이 아닌 리스트 컴프리헨션을 쓴 이유는 이렇게, 숫자 배열의 곱을 구하는 방법을 3가지 알아보았다. 마치며숫자 배열의 원소의 곱을 구하는 방법을 일반적인 구현, 함수형 프로그래밍 기법을 통한 구현, 메타프로그래밍을 통한 구현을 통해 살펴보았다. 이 중에서, 실제로 만들어 써야 한다면 난 2번을 택하겠다. 1번은 재미가 없고, 3번은 다른 개발자들이 익숙하지 않아 가독성이 떨어질 수 있기 때문이다. 하지만 하지만 꼭 2번이 정답일 필요는 없다. 자신이 마음에 드는 구현을 최적화하는 재미가 또 있을테니까. 다른 방법이 더 있지 않을까 하는데 일단 여기서 넘어가자. |