함수 : 프로그램에서 어떤 특정 기능을 수행할 목적으로 만들어진 재사용 구조의 코드 부분
함수의 장점
하나의 큰 프로그램을 여러 부분으로 나눌 수 있기 때문에 구조적 프로그래밍이 가능해짐 |
동일 함수를 여러 곳에서 필요할 때마다 호출할 수 있음 |
수정이 용이함 |
함수 사용방법
순수 함수(pure function) : 결과값 반환 외에 외부에 영향을 주지 않는 함수 |
함수형 프로그래밍 지원 언어에서는 순수 함수를 인자, 반환값으로 사용 |
함수의 선언
def 함수명 (매개변수): 명령문 명령문 return |
함수 선언의 위치 문제
인터프리터 언어의 경우 함수의 선언위치가 매우 중요하다.
따라서 함수는 위쪽에 작성해주는 것이 좋다.
매개변수 : 함수 호출시 입력 밧을 전달 받기 위한 변수
전달받은 인자의 값에 의해 타입이 결정됨
선언된 매개변수 만큼의 인자만 전달됨
언팩 연산자(*) : 매개변수의 개수를 가변적으로 사용할 수 있도록 언팩 연산자(*) 제공
매개변수에 적용시 인자를 튜플형식으로 처리한다.
예제
def calc_sum(*params): total =0 for val in params: total += val return total ret_val = calc_sum(1,2) print(ret_val) => 3 ret_val = calc_sum(1,2,3) print(ret_val) => 6 |
명시적 매개변수와 가변 매개변수를 혼합사용하기 위해서는 가변 매개변수를 뒤에 전달하는 것이 좋다.
언팩 연산자를 이용하면 여러개의 반환값 처리가 가능하다
def calc_sum(*params): total1 =0 total2 = 0.0 for val in params: total1 += val total2 += val return total1, total2 |
키워드 언팩 연산자(**) : 매개변수의 개수를 가변적으로 사용할 수 있도록 함
키워드 인자들을 전달해 매개변수를 딕셔너리 형식으로 처리함
키1 = 값1, 키2 = 값2 형식으로 호출
def function(**params): for k in params.keys(): print("{0}: {1}".format(k, params[k] ) function(a=1, b=2, c=3) |
매개변수에 사용할 기본 값을 지정할 수 있으며, 기본값을 가진 매개변수는 일반 매개변수 앞에 위치할 수 없다.
def calc(x, y, operator = "+"): if operator == "+": return x + y else : return x - y print(calc(2,1)) => 3 print(calc(2,1,"-")) => 1 |
매개변수 | 함수에 입력값을 전달해야 하는가를 결정하는 요인 |
반환값 | 함수가 수행결과를 호출한 곳으로 돌려줄 필요가 있는가를 결정하는 요인 |
함수의 유형
매개변수와 반환값이 있는 함수 |
매개변수는 없고 반환 값이 있는 함수 |
매개변수는 있고 반환값이 없는 함수 |
매개변수와 반환값이 없는 함수 |
scope : 변수의 유효범위
어디서나 접근이 가능한 전역변수 : 전역 스코프 |
함수 내에서만 적븐이 가능한 지역변수 : 함수 스코프 |
변수에 접근하는 절차
1순위 | 함수 스코프 내에서 가장 먼저 변수를 찾는다. |
2순위 | 함수 스코프 내에 없을경우 전역 스코프에서 변수를 찾는다. |
지역변수와 전역변수의 이름이 같을경우 전역변수에 접근을 못할 수 있다. 이때 global을 앞에 기술하면 접근이 가능하다. |
중첩함수 : 함수 내에 중첩함수를 선언해 사용 가능
중첩함수를 포함하는 함수 내에서만 호출이 가능함 |
중첩함수를 포함하는 함수의 스코프에도 접근이 가능함 |
함수 내에서 직접 선언해 호출할 수도 있고, 함수의 매개변수로 함수 인자를 전달받아 함수 내에서 호출해서 사용 가능 |
def calc(operator_fn, x, y): return operator_fn(x, y) def plus(op1, op2) : return op1 + op2 def minus(op1, op2): return op1 - op2 print(calc(plus, 10, 5)) => 15 print(calc(minus, 10, 5)) => 5 |
람다식
Lambda 매개변수 : 반환값
변수에 저장해 재사용이 가능한 함수처럼 사용함 |
기존의 함수처럼 매개변수의 인자로 전달함 |
함수의 매개변수에 직접 인자로 전달함 |
def calc(operator_fn, x, y): return operator_fn(x, y) print(calc(lambda a, b : a + b, 10, 5)) => 15 print(calc(lambda a, b : a - b, 10, 5)) => 5 |
클로저
중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근가능 |
중첩함수 자체를 반환값으로 사용한다면?
|
def outer_func(): id = 0 def inner_func(): nonlocal id #inner_fucn의 지역변수가 아님을 선언 id += 1 return id return inner_func make_id = outer_func() print("make_id() 호출의 결과: {0}".format(make_id())) print("make_id() 호출의 결과: {0}".format(make_id())) print("make_id() 호출의 결과: {0}".format(make_id())) |
원의 면적과 둘레구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
PI = 3.14
#입력받기
def input_radius():
radius_str = input("반지름을 입력하세요: ")
return float(radius_str)
#원의 면적
def calc_circle_area(r):
return PI * r * r
#원의 둘레
def calc_circumference(r):
return 2 * PI * r
radius = input_radius()
circle_area = calc_circle_area(radius)
circumference = calc_circumference(radius)
print("원의 면적: {0:0.2f}, 원의 둘레: {1:0.2f}".format(circle_area, circumference))
|
'프로그래밍언어 > Python' 카테고리의 다른 글
파이썬 - 예외처리 (0) | 2020.01.19 |
---|---|
파이썬 - 내장함수 (0) | 2020.01.18 |
파이썬 - 흐름과 제어(반복) (0) | 2020.01.16 |
파이썬 - 웹데이터 가져오기 (0) | 2020.01.15 |
파이썬 - 흐름과 제어(조건문) (0) | 2020.01.15 |
댓글