함수적 기법 (1)
1. 함수 생성
def ... return...
- return은 생략할 수 있지만, 생략할 때는
print()
처럼 내부적 yield가 있어야 함return NONE
을 생략한 형태임
2. Positional ( / ) / Keyword ( * ) 방식
/
: positional 방식으로만 사용할 수 있음- keyword 방식의 argument를 받지 않음
- ex.
len(obj, /)
를 사용할 경우len(obj=[1,2,3])
TypeError Traceback (most recent call last) <ipython-input-3-d05711b44b3b> in <module> ----> 1 len(obj = [1,2,3]) TypeError: len() takes no keyword arguments
*
,*args
,**kwargs
- *: 이후부터 keyword 방식으로만 써야 함
def function_name(*, a): return a function_name(3) # Error
- *a: 가변 포지션
def function_name(*a): return sum(a) function_name([1,2,3,4]) function_name([1,2,3])
- **a: 가변키워드
def function_name(**a): return a function_name(a=1, b=1) # {'a': 1, 'b': 1}
*
,**
은 같이 쓸 수도 있지만*
이**
보다 먼저 와야 함- unpacking
def x(*a): return a x(*[1,2,3,4,5]) # (1, 2, 3, 4, 5) x(*{'a':1, 'b':2}) # ('a', 'b') # dictionary로 넣으면 key만 나옴
- *: 이후부터 keyword 방식으로만 써야 함
3. 삼항연산자
- 다음과 같이 사용 가능
b = 3 if a>0 else 5
def aa(x): return x aa(3 if a>0 else 5)
4. and / or
- and는 앞에가 True면 뒤에 거 반환, False면 앞에 거 반환
- -1, 1, 2, 3…은 기본적으로 True
- 0, ‘’, {}, (), [], None, set()…은 기본적으로 False
3 and 4 # 4
- or는 앞에가 True면 앞에 거 반환, False면 뒤에 거 반환
3 or 4 # 3
5. global / nonlocal
- global
- global은 사용을 자제하는 것이 좋음 ```py x = 1 def a(): x = 2 def b(): global x x = x+3 return x return b()
a() # 4 ```
- nonlocal
x = 1 def a(): x = 2 def b(): nonlocal x x = x+3 return x return b() a() # 5
6. else의 사용
(1) for
for문에서 사용되는 else는 for문이 다 돌아가고 나서 실행되는 구문을 만들 때 사용한다.
for i in range(5):
print(i)
else:
print('end')
# 0
# 1
# 2
# 3
# 4
# end
for i in range(5):
if i==3:
break
print(i)
else:
print('end')
# 0
# 1
# 2
(2) while
while에서도 for문에서와 마찬가지로 else는 while문 실행을 완벽하게 수행하고 나서 실행되는 구문을 만들 때 사용한다.
i = 0
while i>5:
print(i)
i += 1
else:
print('end')
# end
# 아예 안돌아가도 else는 실행됨
(3) try
에러가 발생하지 않았을 경우 실행되는 구문을 만들 때 사용한다.
try:
a = 1/0
except ZeroDivisionError:
# except는 여러 개 사용할 수 있음.
# 단 ZeroDevisionError처럼 이름 지정해야하고 이름 지정한 except 구문이 먼저 와야 함
print('zeros')
except:
print('error')
else:
print('no error')
finally:
# 에러가 나던지 안나던지 항상 실행
print('always')
7. Error Check
- 강제로 에러 발생시키기
- assert
a = 1 assert a!=1 # False가 나오면 에러 발생 # 중간 체크 용도로 사용
- raise
def x(a): if a==1: raise Exception x(1) # Exception
- assert
- as 사용
try: a = 1/0 except Exception as e: # 설명을 출력하고 싶을 때 as 사용 print(e) # division by zero
8. High-order Function (고차함수)
함수를 인자로 받고, 함수를 리턴할 수 있는 함수
(1) map
list(map(lambda x:x+1, [1,2,3,4,5]))
# [2, 3, 4, 5, 6]
list(map(lambda x,y: x+y, range(10), range(10)))
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(2) filter
list(filter(lambda x:x>3, [1,2,3,4,5]))
# [4,5]
(3) reduce
from functools import reduce
# 1+2=3, 3+3=6, 6+4=10, 10+5=15
reduce(lambda x,y:x+y, [1,2,3,4,5])
# 15
# 이것보다는 sum()이 더 빠르기는 함
import numpy as np
np.add.reduce([1,2,3,4,5])
# 15
(4) partial
- 함수의 일부를 내 마음대로 바꿀 수 있음
from functools import partial
def add(x,y):
return x+y
add1 = partial(add, y=1)
add1(3)
# 4
기타
속도체크하기
%%timeit
: 전체 셀의 실행시간을 알려줌%timeit
: 한 줄의 실행시간을 알려줌
현재 커널 메모리에 할당된 변수정보 반환
%whos
: 변수명, 유형, 데이터 정보를 상세히 반환
함수명을 변수로 잘못 사용했을 때
print = 1
# 원래대로
del print
Leave a comment