Back-End/Python

def

pshoon25 2022. 12. 5. 02:09

def란 무엇일까 ?

 

defdefinition의 약자이다.

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