
# [추가] 함수도 객체이다


def case1():
    print('case-1')

def case2():
    print('case-2')

def case3():
    print('case-3')

f = { 'a1':case1, 'a2':case2, 'a3':case3 }
print(f['a2'])
f['a2']() # 함수객체 ()함수호출
print(f['a2']())



#---------------------------------------
# 글로벌 변수와 지역변수
# 글로벌변수 (전역변수) : 함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수
# 지역변수 : 변수를 만든 함수 안에서만 접근할 수 있는 변수이다. 함수 바깥에서는 접근할 수 없다.
'''
# (1)
temp = '글로벌'
def func():
    print('1>', temp)

func()
print('2>', temp)


print()
# (2)
temp = '글로벌'
def func():
    # print('0'> temp) > 에러 > 지역변수 선언이 감지되는데, 앞에 선언했기때문에 지역변수 값이 없어서 에러발생
    temp = '지역'
    print('1>', temp) #지역

func()
print('2>', temp) #글로벌
'''


print()
# (3)
temp = '글로벌'
def func():
    global temp
    temp = '지역'
    print('1>', temp) #지역

func()
print('2>', temp) #지역





print()
'''
#----------------------------------------------
# 람다함수 - 한번 사용하고 버리는 함수
# 파이션에서는 람다함수를 한 줄로 작성???

    파이썬 3.x부터는 람다를 권장하지 않는다고.
    몇몇 개발자들이 람다함수 사용시 직관적이지 않다는 이유라는데
    
    종종 사용됨
'''

def f(x, y):
    return x+y

print(f(3,2))

# 람다함수
f = lambda x,y : x+y
print(f(3,2))


#-----------------------------------------------------------
"""  맵리듀스
    (1) map()
         ` 연속 데이터를 저장하는 시퀀스 자료형에서 요소마다 같은 기능을 적용할 때 사용
         ` 형식 : map(함수명, 리스트형식의 입력값)
         ` 파이썬 3.x에서는 list(map(calc, ex)) 반드시 list를 붙여야 리스트 형식으로 반환된다
           파이썬 2.x에서는 list 없이도 리스트 형식으로 반환
    (2) reduce()
         ` 리스트 같은 시퀀스 자료형에 차례대로 함수를 적용하여 모든 값을 통합하는 함수    
    
    파이썬 2.x에서는 많이 사용하던 함수이지만, 최근 문법의 복잡성으로 권장하지 않는 추세란다.
"""

#(1) map
def calc(x):
    return x*2

# calc = lambda x : x*2

data = [1,2,3,4,5]
#for i in data:
#    calc(i)

result = list(map(calc, data))
print(result)

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


print()
#(2)
from functools import reduce

def f(x,y):
    return x*y

print(reduce(f,data)) # data = [1,2,3,4,5] > 1*2*3*4*5

