프로그래밍을 할 때 자주 사용하는 기능을 하나로 묶어놓을 수 있다.
이를 함수라고 하는데, 함수를 사용하면 코드를 조금 더 효율적으로 작성할 수 있다.
필요한 기능을 함수로 작성해두고 필요할때마다 호출해서 사용한다.
파이썬에 함수는 크게 두 가지로 나눌 수 있다.
내장함수 | 파이썬이 이미 가지고 있는 함수 ex) print(), len() |
사용자정의함수 | 사용자가 정의해서 사용하는 함수 |
사용자정의함수 (User Define function)
1. 만드는 방법
- 키워드
def를 이용한다.
- 함수명
함수명은 변수명과 비슷한 방법으로 정한다.
키워드, 한글, 숫자로 시작, 중간 공백, 기존의 함수명 모두 X
일반적으로 단일 단어로 되어있는 함수는 사용하지 않는다.return
함수를 호출한 곳으로 결과값을 전달하는 역할과 동시에 함수 호출을 종료한다.
ex) f(x, y) = 2x + 3y 라는 함수를 코드로 표현하면 다음과 같다def f(x, y) : result = 2*x + 3*y return result
- 인자
함수는 인자를 받아들인다.
인자는 parameter, 파라미터, 매개변수라고도 한다
2. 함수 호출
만든 함수를 실제로 사용할 때 호출(call)을 해야한다.
호출하는 방식은 다음과 같다.이때 인자의 자리에 들어가는 값을 실인자(actual parameter)라고 한다.
함수를 정의할 때 들어가는 인자는 formal parameter라고 한다.
함수를 호출할 때는 정의시 선언한 인자의 갯수만큼 모두 인자를 전달해야한다.
여러 개의 인자는 따로 선언하지 않으면 순서대로 값이 들어가게 된다
a = f(2, 3)
print(a) ## 13
a = f(2,3) print(a) ## 13
함수를 인자의 개수없이 사용하고 싶다면 *를 사용할 수 있다.
def my_func(*args) :
result = 0
for tmp in args :
result += temp
return result
print(my_func(10,20,30,40,50)) ## 550
*를 사용하여 인자를 선언하면 인자는 tuple의 형태로 전달된다.
위의 함수에서 args = (10,20,30,40,50)이다.
가끔 함수가 값을 여러 개 리턴한다고 생각되는 경우가 아닌데 실제로는 그렇지 않다.
프로그램에서 함수는 항상 값을 한 개만 리턴한다.
def my_func(a, b) :
hap = a + b
gop = a * b
return hap, gop
그런데 위 코드는 아무 문제없이 실행이 된다.
my_func라는 함수는 hap, gop 두 값을 리턴하는 것처럼 보이지만
사실은 그렇지 않기 때문이다.
hap, gop의 두 값을 튜플로 묶어서 리턴한다. (튜플은 소괄호를 생략할 수 있다.)
print(type(my_func(10, 20))를 확인해보면 알 수 있다.
print(type(my_func(10, 20))) ## <class 'tuple'>
a, b = my_func(10, 20)
print(a, b) ## 30 200
이 경우에도 a, b는 두 개의 변수에 my_func을 리턴받는 것이 아니라 (a, b)라는 튜플로 리턴을 하는 것이다.
이게 가능한 이유는 언패킹이 일어나기 때문이다
Default parameter
기본값 매개변수
기본값 매개변수는 함수를 호출 시 매개변수의 값을 전달하지 않아도 미리 설정한 기본값이 사용되게 지정할 수 있게 한다.
def my_func(a, b, c=100) :
return a+b+c
print(my_func(1,2,3)) ## 6
print(my_func(1,2)) ## 103
기본값 매개변수는 인자들의 가장 마지막에 선언되어야 한다.
이 자리에 인자가 전달되면 전달된 인자값을 사용하고, 전달되지 않으면 기본값을 사용한다
Mutable(가변의) vs Immutable(불변의)
다른언어에서는 다음과 같은 용어로 불린다.
mutable => call-by-value
immutable => call-by-reference
예시를 먼저 보자
def my_func(t_num, t_list) :
t_num += 100
t_list.append(100)
data_x = 10
data_list = [10]
print(data_x, data_list) ## 10 [10]
## 함수호출
my_func(data_x, data_list)
print(data_x, data_list) ## 10 [10, 100]
첫 번째 프린트 결과와 두 번째 프린트 결과를 확인해보면,
함수 호출 후 data_x는 그대로 값이 유지되었는데
data_list는 리스트가 변경되었다
- data_x : immutable로 함수호출할 때 같은 값을 복사해서 전달
- data_list : mutable로 함수호출할 때 값을 복사하는 것이 아니라 reference, 주소값을 전달하기 때문에 함수 안에서 해당 주소값에 접근하여 리스트를 변경하면 함수 호출 후 함수 밖에서도 그 변경사항이 적용된다.
대표적으로 int는 immutable, list는 mutable이다.
local variable & global variable
파이썬 변수가 사용되는 영역에 따라 종류를 지역변수, 전역변수 두 가지로 나눌 수 있다.
지역변수는 클래스, 함수 등의 내부에서만 사용되는 변수를 말하고
전역변수는 코드 전체에서 사용되는 변수를 말한다.
이때 변수, 즉 식별자를 찾을 수 있는 영역을 scope라고 한다.
- scope : 식별자를 찾을 수 있는 영역
temp = 100
def my_func(x) :
temp += x
return temp
print(my_func(10))
이 코드는 "UnboundLocalError: local variable 'temp' referenced before assignment"의 에러가 나온다.
함수는 실행될 때 자신만의 스택영역에서 실행된다.
temp는 my_func의 스택영역에서 찾을 수 없다.
이를 scope가 다르다고 한다.
함수의 내부에서 temp라는 변수를 사용하려면
global 키워드를 사용하거나, temp를 매개변수로 받아서 함수 안에서 정의를 해주어야 한다
##global 키워드 사용하기
temp = 100
def my_func(x) :
global temp
temp += x
return temp
print(my_func(10)) ## 110
반대로 함수 내의 x는 외부의 영역에서 접근할 수 없다.
print(x)
=> NameError : 변수가 선언되지 않았다는 에러가 나온다.
이 예에서 x는 지역변수, temp는 전역변수이다.
이 문제는 globla키워드를 사용하면 손쉽게 해결이 되지만 좋은 코드라고는 할 수 없다.
scope가 왔다갔다하기 때문이다.
이런 방식으로 코드를 작성하게 되면 처음에는 편리할지 몰라도 외부의 영역과 함수 스택영역이 서로 얽혀서 나중에 복잡한 프로그래밍을 할 때 수정이 어려워지는 문제를 만들게된다.
이를 유지보수성이 좋지 않다고 한다.
스파게티 코드
컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티 면발에 비유한 표현
내장함수
파이썬의 내장함수는 설명할 수 없을만큼 종류가 다양하다.
한 번에 전부 공부하기보다 필요한 함수를 그때그때 학습하는 것이 효율적이다
'Programming > Python' 카테고리의 다른 글
[python] 환경변수 설정과 모듈만들기 (1) | 2022.01.26 |
---|---|
[python] 매직메소드 Magin Method (0) | 2022.01.26 |
[python] 제어문 Control Statement (0) | 2022.01.20 |
[Python]Data type 2 - Sequence, Text Sequence, Mapping, Set, Bool (0) | 2022.01.20 |
[python] id()함수과 숫자 객체의 메모리 주소 값 (0) | 2022.01.19 |