람다, 함수에 대한 기초적인 내용을 공부하였다.
========================== 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 |