엄범


lambda

```python
lambda args : returns
```

람다식은 `` filter, map, eval``같은 larger expression에 끼워서(inline) 사용하는 경우 가독성을 높여준다.


복잡한 상황에서는 명확한 ``py def``를 사용하는 편이 가독성이 더 좋다.

그리고 이런 식으로 람다식을 변수에 할당해서 쓰는 것은 지양해야 한다. (PEP8)

```py

sum = lambda a, b: a+b       # No

def sum(a, b): return a+b    # Yes

```


람다식을 사용하면 filter를 사용할 때 만들어야 하는 조건 함수를 대체할 수 있다.

```py

print(list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6])))

```

자바 8에서의 람다식과 비슷하지만 함수형 인터페이스를 구현할 필요가 없다는 점이 편리하고 반복문을 사용할 수 없는 eval 등에 사용할 수 있다.


filter / map

filter와 map은 다음 세가지를 사용해 대체할 수 있다.
넘파이를 사용한다면 당연히 브로드캐스트를 사용하는게 좋으나 넘파이를 사용하지 않는다면 뭘 선택할지는 본인 마음인 듯.
단순 리스트 순회같은 경우 함수형을 사용하는 것이 가독성에 도움이 되는 것 같음.
  • numpy 브로드캐스트
  • list comprehension
  • generator

filter(function, iterable)

iterable에서 항목을 하나씩 function에 넘겨 return값이 true인 경우만 추출한다. 

필터를 사용하면 반복문을 사용해 순회하며 비교해야 하는 작업을 간단히 처리할 수 있다.

즉 function에는 조건역할을 하는 function이 들어가야 한다. ( ``py return expr`` )

* 이렇게 ``py True/False``를 반환하는 함수를 predicate(술어)라고 한다.


리스트에서 양수만 추출해서 리스트로 만드는 작업을 필터로 처리한 예다.

```py

def positive(x):

    return x > 0


print(list(filter(positive, [1, -3, 2, 0, -5, 6])))

```

filter 함수는 filter object를 반환하므로, 이를 list()로 묶어 list로 만들어야 사용할 수 있다.


map(function, iterable)

iterable에서 각각의 원소에 대해 function을 적용한 결과를 묶어서 리턴해준다. 

filter와 비슷하다고 생각할 수 있겠지만, filter는 function에 넘겨 수행한 결과가 True인 iterable의 항목을 추출하는 것이기 때문에 결과값을 추출하는 map과는 완전히 다르다.


또한 function이 조건함수여야만 하는 것은 아니다.

```py

print(list(map(lambda x: x*2, [1, 2, 3, 4, -1, -2, -5, -10])))

=>[2, 4, 6, 8, -2, -4, -10, -20]

```


filter의 경우 x*2를 입력하면 x*2의 결과가 항상 참이기 때문에 원래 리스트를 반환한다.

map을 filter처럼 사용하면 다음과 같이 ``py True/False``가 반환된다.

```py

print(list(map(lambda x: x>0, [1, 2, 3, 4, -1, -2, -5, -10])))

=>[True, True, True, True, False, False, False, False]

```


filter와 map을 조합해서 사용하기

```py

>>> list(map(lambda x: x*2, filter(lambda x: x>0, [1, 2, 3, 4, -1, -2, -3, -4])))

[2, 4, 6, 8]

```