69 lines
3.4 KiB
Markdown
69 lines
3.4 KiB
Markdown
# 함수형 프로그래밍(Functional Programming)
|
|
함수형 프로그래밍은 데이터를 처리하는 것을 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임입니다. 즉, 함수를 하나의 값으로 취급하고, 함수의 입력값에 따라 항상 같은 출력값을 내는 순수 함수를 지향합니다.
|
|
|
|
## 함수형 프로그래밍의 핵심 개념
|
|
* 순수 함수:
|
|
- 함수 외부의 상태를 변경하지 않습니다.
|
|
- 같은 입력값에 대해 항상 같은 출력값을 반환합니다.
|
|
- 부수 효과가 없습니다.
|
|
* 불변성: 데이터를 변경하는 대신 새로운 데이터를 생성합니다.
|
|
* 고차 함수: 함수를 인자로 받거나 함수를 반환하는 함수입니다.
|
|
* 일급 시민: 함수를 변수에 할당하고, 다른 함수의 인자로 전달하고, 반환값으로 사용할 수 있습니다.
|
|
|
|
## 함수형 프로그래밍의 장점
|
|
* 코드의 가독성 향상: 순수 함수를 사용하여 코드를 간결하고 명확하게 작성할 수 있습니다.
|
|
* 테스트 용이성: 순수 함수는 입력값에 대한 출력값이 항상 일정하기 때문에 테스트하기 쉽습니다.
|
|
* 병렬 처리: 순수 함수는 부수 효과가 없기 때문에 병렬 처리에 적합합니다.
|
|
* 재사용성: 잘 정의된 함수를 재사용하여 코드를 효율적으로 작성할 수 있습니다.
|
|
|
|
## 함수형 프로그래밍과 연관된 함수
|
|
### map
|
|
주어진 함수를 반복 가능한 객체(리스트, 튜플 등)의 모든 요소에 적용하여 새로운 이터레이터를 반환합니다.
|
|
```python
|
|
map(function, iterable)
|
|
```
|
|
|
|
```python
|
|
numbers = [1, 2, 3, 4, 5]
|
|
squared = list(map(lambda x: x**2, numbers)) # [1, 4, 9, 16, 25]
|
|
```
|
|
위 예시에서 map 함수는 각 숫자를 제곱하는 람다 함수를 numbers 리스트의 모든 요소에 적용하여 새로운 리스트 squared를 생성합니다.
|
|
|
|
### filter
|
|
주어진 함수를 사용하여 반복 가능한 객체의 요소를 필터링합니다. 함수가 True를 반환하는 요소만 새로운 이터레이터에 포함됩니다.
|
|
```python
|
|
filter(function, iterable)
|
|
```
|
|
```python
|
|
numbers = [1, 2, 3, 4, 5]
|
|
even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) # [2, 4]
|
|
```
|
|
위 예시에서 filter 함수는 numbers 리스트에서 짝수만 필터링하여 새로운 리스트 even_numbers를 생성합니다.
|
|
|
|
### reduce
|
|
시퀀스의 요소들을 누적적으로 처리하여 단일 값을 반환합니다. functools 모듈에서 제공됩니다.
|
|
```python
|
|
functools.reduce(function, iterable, initializer=None)
|
|
```
|
|
```python
|
|
from functools import reduce
|
|
numbers = [1, 2, 3, 4]
|
|
product = reduce(lambda x, y: x * y, numbers) # 1 * 2 * 3 * 4 = 24
|
|
```
|
|
|
|
> map, filter 함수는 파이썬 2와 3에서 동작 방식이 약간 다릅니다. 파이썬 3에서는 결과가 바로 리스트로 반환되지 않고 이터레이터를 반환하므로, 리스트로 변환하여 사용해야 합니다.
|
|
|
|
### 람다 함수와의 조합
|
|
map, filter 함수는 람다 함수와 함께 자주 사용됩니다. 람다 함수는 간결하게 함수를 정의할 수 있기 때문에 이러한 고차 함수와의 조합이 매우 효율적입니다.
|
|
|
|
```python
|
|
numbers = [1, 2, 3, 4, 5]
|
|
|
|
# 숫자를 제곱하는 함수
|
|
def square(x):
|
|
return x * x
|
|
|
|
# map 함수를 사용하여 각 숫자를 제곱
|
|
squared_numbers = list(map(square, numbers))
|
|
print(squared_numbers) # [1, 4, 9, 16, 25]
|
|
``` |