728x90
- 함수
- 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드 집합
- 함수는 자체 제작가능하고 내장 함수도 존재함
- 내장 함수 : len(), input(), range() 등
- 함수 사용 이유
- 반복적인 프로그래밍 피할 수 있음
- 모듈화로 전체적인 코드의 가독성이 좋아짐
- 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수 가능
- 함수가 동작한 후에 어떠한 결과가 나오는지만 알면 함수 내부 구조를 몰라도 사용하는 데 문제가 없음
- 순수 함수(pure function)
- 결과값 반환외에 외부에 영향을 주지 않는 함수
- 함수형 프로그래밍 지원 언어에서는 순수 함수를 인자, 반환값으로 사용
- 함수의 구조
def 함수명(매개변수) : 실행문장 return 반환변수 |
- def : 함수 선언 - 함수 호출 : 함수명(인수 or 인자) - return
|
- 매개변수와 반환 값이 있는 함수
def add(a, b) :
result = a+b
return result
add(3,4)
- 매개변수는 없고 반환 값이 있는 함수
# 입력값이 없는 함수
def say() :
return 'Hi'
say()
- 매개변수는 있고 반환 값이 없는 함수
# 결과값이 없는 함수
def add(a,b) :
print(f'{a}, {b}의 합은 {a+b}입니다.')
a = add(3,4)
print(a) #None->결과값이 없다는 뜻
- 매개변수와 반환 값이 없는 함수
# 입력값도 결과값도 없는 함수
def say():
print('Hi')
say()
- 함수의 결과값은 언제나 하나
def add(a,b) :
return a+b, a-b
add(5,2) # -> 튜플의 형태로 하나로 반환
- 가변 매개변수(variable parameters)
- 함수 호출시 몇 개의 인수가 전달될 지 알 수 없다면, 사용자가 직접 매개변수의 개수를 정할 수 있도록 선언
- 전달된 인수는 모두 모아서 튜플 형태로 저장
- 언팩 연산자(*) 사용
- 가변 매개변수를 가장 마지막 매개변수로 지정해야 부작용 없이 사용 가능
def 함수명(*매개변수) : 실행문장 return 반환변수 |
def add(*args) :
result = 0
for i in args :
result += i
return result
add(1, 2, 3, 4, 5, 6)
- 매개변수 기본값 설정(default parameters)
- 기본값을 가지는 매개변수는 일반 매개변수 앞에 위치할 수 없음(맨 마지막에 두는 것이 좋음)
def say_myself(name, old, man=True) :
print(f'나의 이름은 {name}입니다.')
print(f'나이는 {old}살 입니다.')
if man :
print('남자입니다.')
else :
print('여자입니다.')
say_myself('홍길동', 27) # 3번째 인자값을 생략하면 기본값이 사용됨
say_myself('유관순', 27, False)
- scope
- 변수의 유효범위
- 어디서나 접근 가능한 전역 변수 : 전역 스코프
- 함수 내에서만 접근 가능한 지역 변수 : 함수 스코프
def test_scope(a) :
result = a + 1
print('\n\ttest_scope() 안에서의 a의 값 : {}'.format(a))
print('\ttest_scope() 안에서의 result의 값 : {}\n"\'.format(result))
return result
x = 5
print('test_scope() 호출 전 x의 값 : {}'.format(x))
ret_val = test_scope(x) # 호출
print('test_scope() 함수가 반환한 값 : {}'.format(ret_val))
print('test_scope() 호출 후 x의 값 : {}'.format(x))
- 변수에 접근하는 절차
- 함수 스코프 내에서 가장 먼저 변수를 찾음
- 함수 스코프 내에 변수가 없을 경우, 전역 스코프에서 변수를 찾음
# 1순위
a = 1
def scope() :
a = 2 # 함수 스코프 내에서 가장 먼저 변수 찾음
print(a)
scope()
print(a)
# 2순위
a = 1 # 2. 전역 스코프에서 변수를 찾음
def scope() :
print(a) # 1. 함수 스코프 내에 변수가 없을 경우
scope()
print(a)
- 위와 같은 절차때문에 지역변수와 전역변수 이름이 같을 경우, 전역변수가 가려져 접근 못할 수 있음
- 접근하고자 하는 전역변수 앞에 global을 기술
# 함수 내에서 global 변수에 접근하기
def chane_global() :
global x # 함수 내에서 x는 전역 변수를 가리킴
x += 1 # 변수 x의 값 5가 인자로 전달되고, 1을 더한 결과값 반환
x = 5 # 변수 x에 5 할당
change_global()
print('전역변수 x의 값 : {}'.format(x)) # 지역 스코프 내에서 변경된 6이 출력됨
- lambda
- def와 동일한 역할
- 함수를 한 줄로 간결하게 만들 때 사용 -> lambda 매개변수 : 반환값
- def를 사용할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 사용
- 함수의 매개변수에 직접 인자로 전달 가능
add = lambda a, b : a+b
add(3,4)
- 클로저
- 중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근 가능
- 중첩함수 자체를 반환값으로 사용한다면?
- 정보 은닉 구현 가능
- 전역변수 남용 방지
- 메서드가 하나밖에 없는 객체를 만드는 것보다 우아한 구현 가능
def outer_func() :
id = 0 # 지역변수
def inner_func() :
nonlocal id # 변수 id 접근 시 outer_func함수 스코프에서 찾게 만듦
id += 1
return id
return inner_func # inner_func함수 호출이 아닌 함수에 대한 참조를 반환
make_id = outer_func()
print(f'make_id() 호출의 결과 : {make_id()}')
print(f'make_id() 호출의 결과 : {make_id()}')
print(f'make_id() 호출의 결과 : {make_id()}')
728x90
'PROGRAMMING > PYTHON' 카테고리의 다른 글
[Python] 클래스 (0) | 2021.04.26 |
---|---|
[Python] 파일 (0) | 2021.04.26 |
[Python] 딕셔너리 (0) | 2021.04.25 |
[Python] 반복문 (0) | 2021.04.25 |
[Python] 리스트, 튜플 (0) | 2021.04.25 |
댓글