람다, 함수에 대한 기초적인 내용을 공부하였다.


========================== Python ==========================

'''

객체(네임스페이스, 변수)

1. 내장(Built-in)

2. 코드블럭을 범위를 넘어서 사용하는 것 => 전역, 글로벌, 멤버 (Global)

3. 지역 => 코드 블록 내부 (Local)


객체를 찾는 순서 : 좁은 곳에서 넓은 곳으로, 내가 할당한 것에서 원래 있던 것으로 간다.

                  즉, 지역 -> 글로벌 -> 내장 순서로 찾는다.

'''


# 전역변수와 지역변수

x = 10

y = 5

def f(a):

    y = a + 20

    return y


print(y)  # 결과는 5. 전역영역이기 때문.

print(f(y))  # 결과는 25. 함수의 리턴값이 전역변수에 영향을 준다.


def aa(a):

    y = a + 20

    a = y + 100

    return a

print(aa(x))  # 결과는 130. 지역에서 정의된 a도 리턴을 통해 출력이 가능하다.


'''

def f():

    a = 1

    b = 2

f.c = 3

print(f.a)  # a라는 객체가 없어서 오류가 발생한다. AttributeError: 'function' object has no attribute 'a'

'''


'''

x = 10

def f():

    a = x     <- 이 부분에서 에러가 발생한다. x라는 값이 전역에 있지만 지역으로 가져오려면 

    x = 20       매개변수로 가져와야 하기 때문이다.

    return x    

'''


x = 10

def f(x):

    a = x  # 이렇게 하면 매개변수로 전역변수 x를 가져오니 문제가 없다.

    x = 20

    return x


def fa(a):

    global x  # global을 이용해서 전역변수를 매개변수가 아닌 형태로 지역으로 가져올 수 있다.

    return x

print(fa(11))  # 결과는 10.


a = []

print(dir(a))  # 사용 가능한 내장 메서드를 보여준다.



x = 2

def f():

    x = 1

    def g():

        print(x)

    g()

f()  # 결과는 1. 지역은 지역 내부에서 정의된

'''

x = 1

def f(x):

    print(x)

    x = 10

    def g():

        print(x)  <- 여기서 오류 발생

        x = 1      <- 이 부분이 추가되면 위의 print(x)에서 오류가 난다.

    g()

    print(x)

f(x)  # 에러발생. UnboundLocalError: local variable 'x' referenced before assignment


'원인'

같은 local 위치에서는 계층에 따라서 찾는 객체의 범위가 달라진다.

즉, g()에 x가 정의되어 있지 않다면 위의 local에서 x를 찾아오지만 g()에 정의되어 있으면

그 내부에서 찾기 때문에 순서가 x = 1; print(x) 순으로 되어야 오류가 발생하지 않는 것이다.

'''


# 람다식

f = lambda x: x+1

print(f(1))  # 결과는 2.

f = lambda x, y: x+y

print(f(1,1))  # 결과는 2.

f = lambda x, y=1: x+y  # 기본값을 지정할 수 있다.

print(f(1))  # 결과는 2.

    # f = lambda x = 1, y: x+y  # 기본값을 지정하는 건 기본값(x)가 아닌 뒤에만 가능하다.


def f1(x):

    return (x*x)+(3*x-10)

def f2(x):

    return x*x*x

def g(fu):

    return [fu(x) for x in range(-10,10)]


print(g(f1))

print(g(lambda x: (x*x)+(3*x-10)))


# 계산기 만들기

func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y : x / y]

def menu():

    print('0. 더하기', '1. 빼기', '2. 곱하기', '3. 나누기', '4. 종료')

    return int(input('메뉴 선택: '))

while 1:

    sel = menu()

    if sel < 0 or sel > len(func):   # 잘못 입력

        print('다시 입력하세요.')

        continue

    if sel == len(func):   # 종료 조건

        break

    x = int(input('첫 번재 숫자 : '))

    y = int(input('두 번째 숫자 : '))

    print('결과는 =', func[sel](x,y))


##### 람다 함수

### 람다 함수의 구현

# 인자가 하나인 경우

f = lambda x: x+1

print(f(1))  # 결과는 2.


# 인자가 두 개 인 경우

f = lambda x, y: x+y

print(f(1,2))  # 결과는 3.


# 기본값을 가지는 경우

f = lambda x, y = 1: x+y

print('기본값 적용: ', f(10))  # 결과는 11. 기본값이 있는 경우 값을 꼭 다 입력할 필요는 없다.

print('기본값 미적용: ', f(10, 5))  # 결과는 15. 두 개를 입력해도 무방방

    # f = lambda x=1, y: x+y  # 맨 앞에 쓰여지는 초기값(여기서는 x)에는 기본값을 넣으면 안 된다.

                              # SyntaxError: non-default argument follows default argument


# 가변인자를 지니는 람다 함수

vargs = lambda x, *args: args

print(vargs(1,2,3,4,5))  # 결과는 (2,3,4,5). 1은 x에 할당되기 때문에 제외되었다.




### 람다 함수의 활용

def f1(x):

    return (x*x)+(3*x-10)

def f2(x):

    return x*x*x

def g(func):

    return [func(x) for x in range(-10, 10)]

print(g(f1))  # 아래와 동일

print(g(f2))  # 아래와 동일


def g(func):

    return [func(x) for x in range(-10, 10)]

print(g(lambda x: (x*x)+(3*x-10)))  # 위와 동일

print(g(lambda x: x*x*x))  # 위와 동일


# 간단한 사칙연산

func = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]

def menu( ):

    print('0.더하기', '1.빼기', '2.곱하기', '3.나누기', '4.종료')

    return int(input('메뉴 선택: '))

while True:

    sel = menu( )

    if sel < 0 or sel > len(func):

        continue

    if sel == len(func):

        break

    x = int(input('첫번째 숫자: '))

    y = int(input('두번째 숫자: '))

    print('결과 =', func[sel](x,y))


# map 내장함수 : 동일한 수행을 반복해서 해야 할 때 사용한다. map(수행방법, 넣을 인자) 형태로 사용한다.

#               결과는 map 타입으로 나온다.

def f(x):

    return x*x

a = [1,2,3,4,5]

b = []

for x in a:

    y = f(x)

    b.append(y)

print(b)


def f(x):

    return x*x

a=[1,2,3,4,5]

b=map(f,a)  # map 사용. a를 f에 넣어 값을 b에 할당한다.

print(type(b))  # <class 'map'>

print(b)  # <map object at 0x0000001B5B9F1978>. 주소값만 출력된다.

print(list(b))  # 결과는 [1, 4, 9, 16, 25].


a=[1,2,3,4,5]

print(list(map(lambda x:x*x,a)))  # 람다와 맵을 이용하면 이렇게 짧게 출력 가능하다.


a = map(lambda x: len(x), ['Hello', 'Python', 'Programming'])  # 각 단어의 길이를 a에 저장한다.

print(list(a))  # 결과는 [5,6,11].

print(list(map(lambda x:x*x, a)))  # [25, 36, 121]


# filter : 논리식에서 결과가 참인 것만 걸러서 보여준다.

print(list(filter(lambda x: x > 2, [1, 2, 3, 4, 5])))  # 결과는 [3, 4, 5]. 2를 초과하는 값만 선별한다.

print(list(filter(lambda x: x % 2,[1, 2, 3, 4, 5, 6])))  # 결과는 [1,3,5]. 나머지가 있는 홀수만 선별한다.

print(list(filter(lambda x:x % 2 - 1,[1, 2, 3, 4, 5, 6])))  # 결과는 [2, 4, 6]. 짝수만 선별한다.

def f():

    x=1

    print(list(filter(lambda a: a > x, range(-5, 5))))

f()  # 결과는 [2, 3, 4]. 1을 초과하는 값만 선별한다.


========================== Python ==========================

'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글

[Python] Python 12일차  (0) 2018.05.30
[Python] Python 11일차  (1) 2018.05.29
[R] 10일차  (0) 2018.05.28
[Python] 9일차  (0) 2018.05.23
[R] R 9일차  (0) 2018.05.23

+ Recent posts