def란 무엇일까 ?
def는 definition의 약자이다.
definition의 뜻은 '정의'이다.
그렇다면 무엇을 정의한다는 것일까 ?
그것은 '함수(function)'이다.
함수란 무엇일까 ?
코딩을 하다보면 특정 기능을 여러번 작성하여 수행을 할 일이 발생한다.
그럴경우 같은 코드를 여러번 반복하여 사용한다면 비효율적일 것이다.
이럴 경우, 반복되는 코드를 하나의 '함수'로 지정하여 한 줄로 간략하게 요약하여 사용할 수 있다.
수학에서 함수는 y = f(x) 이다.
즉, 우리가 수행하기 원하는 코드 f(x)를 작성하여, x에 입력값을 입력하여 y라는 출력값을 얻을 수 있다.
🔎 파이썬에서 함수는 어떻게 생성되는지 알아보자.
파이썬에서 함수 코드의 구조는 아래와 같다.
def <함수명>(인자 1, 인자 2, ...) :
<코드 블록>
return <반환 값>
각 구조에 대해 설명하자면,
<함수명>
우선 <함수명>은 <코드 블록>에 내용을 정의하는 이름을 적으면 된다.
예를 들어, 1부터 9까지의 곱하기 값을 구해주는 코드 블록을 작성하였다면, 함수명은 'gugudan' 등으로 작성하면 된다.
<인자>_'Parameter'라고도 명칭
인자는 프로그래밍에서 입력값을 뜻한다.
즉, 인자1, 인자2에 입력받는 값이 <코드 블록>으로 전달되는 값이다.
인자와 인자 사이는 콤마( , )로 구분된다.
함수에서 사용할 인자가 없을 경우, 소괄호( )만 입력해도 무관하다.
<코드 블록>
코드 블록 안에는 수행될 코드를 작성하면 된다.
코드 블록을 잘성할 때 들여쓰기를 해야 한다.
<반환 값>
반환 값이 있을 경우 작성하되,
반환 값이 없으면 입력하지 않아도 된다. (None)
<함수 호출>
함수는 반드시 호출하여야 수행이된다.
함수의 코드 수행이 끝난 후에는 다시 호출이 일어났던 시점으로 되돌아간다.
함수의 호출 구조는 아래와 같다.
<함수명>(인자 1, 인자 2,...)
인자 값이 없을 경우, 함수명과 소괄호만 입력해주면 된다.
※함수의 유형은 <인자 값>과 <반환 값>의 유/무에 따라 나뉜다.
1. 인자 값, 반환값 無
def pi() :
print(3.14)
pi()
# 출력값
# 3.14
2. 인자값 有, 반환값 無
def sum(x, y) :
print(f'{x} + {y} = {x+y}')
sum(10, 20) # 10 + 20 = 30
3. 인자값 無, 반환값 有 (단, return 값은 여러 개 일 수 있다.)
3-1. 반환 값이 한 개 일 경우,
def fun() :
return 10
fun() # 미출력
print(fun()) # fun 함수 실행 10
* <코드 블록>에 출력 함수 print가 있을 경우,
'함수명()'만 실행하여도 결과가 출력 되는 것을 볼 수 있다.
다만, <코드 블록>에 출력 함수가 없을 경우에는 위처럼 아무것도 출력 되지 않는다.
함수가 실행은 하되, 출력함수가 없기 때문이다.
그래서 우리가 출력함수가 없을 경우, 반환값을 보기 위해서는 함수 사용에 print를 사용하여야 한다.
3-2. 반환 값이 여러 개 일 경우,
def fun() :
print('fun 함수 실행')
return 10, 20, 30
a, b, c = fun() # fun 함수 실행
print(fun()) # fun 함수 실행 (10, 20, 30)
print(a, b, c) # 10 20 30
print(type(fun())) # <class 'tuple'>
*반환 값이 여러 개 일 경우의 데이터 타입은 Tuple인 것을 명심하자.
4. 인자값, 반환값 有
def mult(x, y, z) :
result = x * y * z
return result
mult(2, 5, 10) # 미출력
print(mult(2, 5, 10)) # 100
위의 네 가지 외의 여러가지 특성을 정리하여 보자.
# 인자값보다 파라미터 갯수가 더 많은 경우
def fun2(n=100) : # default 파라미터
print('fun2',n)
fun2() # fun2 100
fun2(999) # fun2 999
# 인자값보다 파라미터 갯수가 더 적은 경우
def fun4(*n) : # packing을 사용하여 묶음
print('fun4')
fun4(1) # fun4
fun4(1, 2, 3) # fun4
fun4(1, 2, 3, 4, 5, 6) # fun4
# 인자 값에 변수 명을 지정하여 사용
def fun6(x, y) :
print(x, y)
fun6(5, 2)
fun6(x=5,y=2) # 변수를 지정하여 값 기입
fun6(y=100, x=50) # 변수를 지정할 경우, 순서 무관
# '=value' 값을 입력해주면 인자값이 없을 때 기본 값 출력, 인자값이 있을 때 인자값 출력
def fun3(n=1, n2=2, n3=3) :
print("fun3", n, n2, n3)
fun3() # fun3 1 2 3
fun3(10) # fun3 10 2 3
fun3(10, 30) # fun3 10 30 3
#fun3(10, 20, 30, 40) # 에러 발생 ==> 파라미터 갯수보다 인자값이 많을 경우
# 변수명 지정 + packing 함수를 사용
def fun7(**a) : # 파라미터 앞 '**' 추가. 딕셔너리로 출력
print(a)
fun7(x=6, y=3) # {'x': 6, 'y': 3}
fun7(x=6, y=3, z=10) # {'x': 6, 'y': 3, 'z': 10}
# 혼합
def fun8(n, n2=1, *n3, **n4) :
print(n, n2, n3, n4)
fun8(10, 3, 40, 4, x=99, y=10) # 10 30 (40, 4) {'x': 99, 'y': 100}
*위 유형으로 우리가 알 수 있는 것
- 반환 값의 갯수는 인자값의 갯수에 영향을 받지 않는다.
- 반환값의 갯수가 여러개일 경우에는 Tuple 타입으로 출력된다.
그렇다면, 함수에서 사용되는 변수와 함수 밖에서 사용되는 변수의 유효 범위는 어떻게 될까 ?
우선, 변수의 유효범위를 알기 전에 알아야 할 것이 있다.
바로 지역 변수(Local variable), 전역 변수 (Global variable)이다.
지역 변수(Local variable)는 함수 안에서 정의된 변수이다.
함수 안에서 정의한 변수는 함수 안에서만 사용할 수 있다.
지역 변수는 함수가 호출될 때 임시 저장 공간(메모리)에 할당되고 함수 실행이 끝나면 사라진다.
즉, 함수 호출시에만 사용되고, 함수 수행이 종료되면 사용할 수 없다.
그와 반대로,
전역 변수 (Global variable)는 함수 내에 포함되는 변수가 아니다.
그러므로 전체 코드 내 어디서나 사용이 가능하다.
예를 참고하여 확인하면,
함수 내의 지역 변수가 함수 외에서 사용될 경우,
def fun() :
m = 10 # 함수 안에 선언되는 변수 = 지역 변수(Local)
print(m)
print(m) # 에러발생 ==> m은 지역변수이기 떄문에 fun 함수 안에서만 사용 가능
*위의 경우 함수 내의 정의된 지역 변수 m이 함수 외에서 사용되었기 때문에 에러가 발생한다.
함수 외의 전역 변수가 함수 내에서 사용될 경우,
x = 10 # 전역 변수(Global) : 함수 내, 외 전체에서 사용 가능
def fun2() :
y = 20 # 지역 변수(Local) : 지정된 함수 내에서만 사용 가능
print(x)
print(y)
print(x) # 10
print(y) # 에러 발생
그와 반대로, 전역 변수를 함수 내에서 사용할 경우에는 정상 수행된다.
그 외에 아래와 같은 예도 있다.
함수를 중첩으로 사용할 경우,
def fun() :
m = 1
print("fun",m)
def fun2() :
n = 10
print('fun2', m)
print('fun2', n)
fun2()
fun()
# 출력값
# fun 1
# fun2 1
# fun2 10
*fun2()라는 함수는 fun()이라는 함수 내에 상속되기 때문에,
fun() 내에 존재하는 지역변수 m은 fun2() 함수 내에서도 사용할 수 있게 된다.
위와 같은 지역 변수, 전역 변수에서 사용할 수 있는 함수가 있다.
그것은 'global 함수'이다.
전역 변수와 지역 변수를 동일한 변수명으로 지정할 경우,
m = 50 # 전역 변수
def fun() :
m = 100 # 지역 변수
print('fun()',m)
def fun2() :
print('fun2',m)
fun2()
fun()
# 출력값
# fun() 100
# fun2 100
*fun2() 함수 내에 입력한 m의 변수는 fun() 함수에 기입된 지역 변수를 사용한다.
global을 사용할 경우,
m = 50 # 전역 변수
def fun() :
m = 100 # 지역 변수
print('fun()',m)
def fun2() :
global m
print('fun2',m)
fun2()
fun()
# 출력값
# fun() 100
# fun2 50
*global 함수를 사용할 경우, fun() 함수에 내장된 지역 변수가 아닌 전역 변수를 사용한다.
위에서 배운 함수를 한 줄로 표현을 할 수 있다.
파이썬에서 한 줄로 함수를 표현하는 함수를 람다(lambda) 함수 라고 한다.
람다 함수는 구성이 단순하여 간단한 연산을 사용할 때 사용된다.
람다 함수의 구조는 다음과 같다.
lambda <인자 값> : <수행 코드>
※람다 함수의 특징은 아래와 같다.
- <함수명>이 지정이 되지 않기 때문에, 이름이 없는 함수 즉 익명함수(anonymous) 라고도 명칭한다.
- <함수명>이 지정되어 있지 않기 때문에 함수를 호출할 수가 없다.
- 위와 같은 문제를 해결하기 위해서 변수에 저장하여 사용한다.
# 인자 값이 없을 경우
fun = lambda : print('fun')
fun() # fun
# 인자 값이 존재할 경우
fun2 = lambda x, y : print('fun2', x, y)
fun2(10, 20) # fun2 10 20
아니면 아래와 같이 작성하여 사용할 수 있다.
(lambda <인자 값> : <수행 코드>) (<인자값>)
print((lambda x, y : print('fun2', x, y)) (100, 200))
# 출력값
# fun2 100 200
함수의 정의와 호출에 대하여 공부하였다.
요약하자면 아래와 같다.
- <인자 값>과 <반환 값>의 유/무
- <지역 변수(local)>와 <전역 변수(global)>의 유효 범위
- 한 줄로 표현할 수 있는 <람다 함수>
✏️✏️코드 작성 시 자주 사용되는 함수 및 특징들이니 꼭 기억하자 !✏️✏️
'Back-End > Python' 카테고리의 다른 글
try, except, finally (0) | 2022.12.08 |
---|---|
class (0) | 2022.12.07 |
for, while (2) | 2022.11.27 |
if (0) | 2022.11.27 |
[](){} (0) | 2022.11.26 |