스터디 그룹/ProjectH4C

ProjectH4C 1개월 2주차 과제 (UNIT 32, 33)

📖 UNIT 32. 람다표현식

람다표현식 어렵다... 정말 어렵다....................

 

def plus_ten(x): return x+10

이 함수가 있다. 그냥 간단하게 주어진 값에 10만큼 더해서 return해준다.

 

이걸 람다 표현식으로 쓸 수 있다. 람다표현식은 함수는 아니고 이름이 없는 함수라고 생각하면 된다.

lambda x: x + 10

먼저 이게 람다표현식으로 plus_ten 함수를 표현한 것이다. 람다표현식은 자기 자신만으로 사용되지는 못한다.

plus_ten = lambda x: x + 10
plus_ten(1)

이렇게 사용이 된다. 람다표현식 내부에서 변수선언은 못하지만, 람다 표현식 바깥에 있는 변수는 사용할 수 있다.

plus_ten을 이용하는 것이 아니라 람다표현식 자체로 함수처럼 쓸 수도 있기는 하다.

(lambda x: x + 10)(1)

위와 같이 해주면 된다.

 list(map(lambda x: x + 10, [1, 2, 3]))

이렇게 람다표현식을 인수로 사용하는 것도 가능하다.

 

필터도 사용해보자. filter는 특정 조건에 맞는 요소를 가져오는 것이다.

 

먼저 f(x)를 선언하자.

def f(x): return x > 5 and x < 10

그리고

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
list(filter(f, a))

이렇게 코드를 짜주면 참인 요소만 출력이 된다.

📒reduce 사용하기

reduce함수는 functools 모듈에 속해있다.

def f(x, y): return x + y
a = [1, 2, 3, 4, 5]
from functools import reduce
reduce(f, a)

이런 코드는 결국 1+2+3+4+5를 실행하게 된다.

📖 UNIT 33. 클로저 사용하기

코딩을 하다보면 전역변수의 값을 지역 함수에서 변경할 경우도 생긴다. 포인터? 를 이용해도 되겠지만, 클로저를 사용해면 매우 편해진다.

x = 10          
def foo():
    global x    
    x = 20      
    print(x)    
 
foo()
print(x)        

이렇게 되면 10이 두번 출력된다.

 

함수안에 함수가 있을 때는 nonlocal을 사용하면 된다. 이 경우 가장 가까운 지역변수를 찾아서 값이 들어가지게 된다.

근데 이거 왜인지 잘못사용하면 코드가 다 꼬일 것 같다.

 

본격적으로 클로저에 대해 알아보자.

 

def calc():
    a = 3
    b = 5
    def mul_add(x):
        return a * x + b    
    return mul_add          
 
c = calc()
print(c(1), c(2), c(3), c(4), c(5))

이런 코드가 있다. 먼저 결과는

8, 11, 14, 17, 20 순으로 출력이 된다. 

 

그냥 스스로 공부를 해보자. 왜이지 홈페이지의 내용을 읽어보니 쉽게 느껴지고 건성건성 공부할 것 같다.

return mul_add 부분까지를 파이썬에 입력해보자. 이후 c = calc()를 해주자.

 

대충 의미를 해석해보자면 c에는 mul_add 함수가 들어가진 것이다.

그래서 c(1) c(2) ... 같은 명령은 mul_add(1), mul_add(2)와 같은 값들을 의미하는 것이다.