함수(Function) 정의
•
입력 → 출력
◦
입력 변수 (파라미터) : 함수에 입력하는 변수
◦
출력 변수 (리턴 값) : 함수 결과
함수 구조
def 함수명(파라미터):
수행 코드
return 출력변수
Python
복사
변수 사용범위(Scope)
•
지역변수(local) : 함수 내부에서 만들어진 지역변수는 함수 내에서만 사용 가능 (파라미터 포함)
•
전역변수(global) : 함수 밖에서 만들어진 변수 (어디서든 사용 가능)
디폴트 파라미터
•
파라미터에 값을 넣지 않았을 떄 기본 적용되는 값
def 함수명(파라미터1=값1, 파라미터2=값2):
return 파라미터1 + 파라미터2
Python
복사
•
디폴트 파라미터에는 None을 사용할 수 있음.
•
디폴트 파라미터는 다른 파라미터보다 나중에 넣어줘야 함.
람다 함수
•
한 줄짜리 간단한 함수를 만들 때 사용
•
1회용 함수를 만들 때 많이 사용 (== 화살표 함수)
•
예제
square_lambda = lambda x:x**2
square_lambda(3)
make_even = lambda x: [i for i in x if i%2 == 0]
make_even([1, 2, 3, 4, 5, 6, 7, 8])
Python
복사
클로져(Closure)
•
내부 함수(중첩 함수)
•
지역변수를 기억하다가 내부 함수를 실행할 떄 기억한 지역 변수 처리
•
반환된 내부함수가 자신이 선언되었을 때의 환경을 기억하고, 외부함수 밖에서 호출되더라도 그 환경에 다시 접근할 수 있는 함수
•
클로저의 조건
◦
내부 함수
◦
외부 함수의 지역 변수를 참조
◦
외부 함수가 내부 함수를 Return
def func_out(out_param):
a = 10
def func_in(): # 조건1 : 내부함수
return a + out_param # 조건2 : 외부 함수(func_out)의 지역변수(a)를 참조
return func_in # 조건 3 : 외부 함수(func_out)가 내부 함수(func_in)를 Return
Python
복사
콜백함수(Callback Function)
•
함수의 인자로 사용되는 함수
def callFunc(a, func): # func : 콜백함수
return func(a)
Python
복사
Decorate
•
코드를 변경하지 않고 기능을 추가하거나 수정하고 싶을 때 정의하는 표현식
•
클로져와 유사
•
호출할 함수명 앞에 @로 표현
•
여러 데코레이터 함수 동시 지정 가능
•
내부 함수의 주소를 리턴하고 함수를 다른 함수의 인자로 전달
def decorator_func(org_func): # 함수를 인자로 받는다.
def wrapper_func(): # 내부함수를 구현한다.
print("org_func 가 실행 되기전 입니다.")
org_func() # org_func 함수를 실행
return wrapper_func # 내부함수의 주소를 반환
@decorator_func
def do_func():
print("original 함수가 실행 되었습니다.")
Python
복사
이터레이터(Iterator)
•
반복 구문을 적용할 수 있는 리스트와 같은 객체
•
반복 가능(iterable) 객체
리스트, 튜플, 딕셔너리, 집합 등이 존재
•
반복이 가능하다면 iter() 함수를 이용하여 iterator로 만들 수 있음.
# 이터레이터를 확인하기 위해 간단한 리스트 생성
test = [10, 20, 30]
# __iter__() 메서드를 사용하여 이터레이터를 쓸 수 있도록 설정
test_iter = iter(test)
# 또는 test_iter = test.__iter__()
# __next__() 메서드를 사용하여 요소를 하나씩 불러옴
print(test_iter.__next__())
print(test_iter.__next__())
print(test_iter.__next__())
print(test_iter.__next__())
# 결과값 : 10
# 결과값 : 20
# 결과값 : 30
# 결과값 : StopIteration 에러 발생
Python
복사
제너레이터(generator)
•
이터레이터를 생성해 주는 함수
•
제너레이터로 생성한 객체는 이터레이터와 마찬가지로 next()함수 호출 시 값을 차례대로 얻을 수 있음.
•
결과 반환을 할 때 return 대신 yield 키워드를 사용
•
메모리 적재 방식 <=> 일반 함수
◦
제너레이터 함수는 값을 한꺼번에 모두 생성하지 않고, 필요할 때마다 하나씩 생성하는 "지연 평가(lazy evaluation)" 방식으로 작동
◦
제너레이터는 값 하나를 생성하고 반환할 때마다 메모리에 해당 값만 저장합니다. 즉, 모든 값을 한꺼번에 메모리에 적재하지 않는다.
◦
필요할 때마다 값을 생성하므로 메모리 사용이 최소화된다.
import time
def gen(count):
start = 1
while start <= count:
yield start # yield를 사용하여 start를 반환
# 1을 실행한 후부터 time.sleep(2)를 실행
time.sleep(2) # yield start 실행 후 2초간 대기
start += 1
for i in gen(3):
print(i)
Python
복사
•
대규모 데이터 처리 예제
def read_large_file(file_path):
with open(file_path, 'r') as file:
for line in file:
yield line
for line in read_large_file('large_file.txt'):
process(line) # 라인을 처리하는 사용자 정의 함수
Python
복사
◦
read_large_file 함수는 파일을 한 줄씩 읽어 yield로 반환
◦
해당 방식은 파일 전체를 메모리에 적재하지 않고, 한 줄씩 읽고 처리하기 때문에 메모리 사용량을 크게 줄일 수 있다.