1. 함수
함수는 일종의 기능을 가진 장치라고 할 수 있다.
예를 들어, 토스트기에 빵을 넣고 시간을 입력하면 구워진 빵을 만들어낸다.
토스트기에 뻥튀기를 넣으면 구워진(?) 뻥튀기가 만들어질 것이다.
여기서 토스트기가 함수
토스트기에 넣은 빵이나 뻥튀기, 구울 시간은 파라미터(매개변수)
토스트기가 내놓은 결과물인 구워진 빵이나 구워진 뻥튀기는 리턴값(반환값)이라고 할 수 있다.
파이썬에서 함수를 선언할 때는 def라는 키워드를 사용한다.
역시나 다른언어들과는 다르게 중괄호를 사용하지 않는다.
def add(x,y):
result = x + y
return result
add 라는 이름의 함수를 선언했다.
그리고 이 함수는 x와 y를 매개변수로 받는다.
그렇게 받은 x값과 y값을 더해서 result로 정의한다.
그리고 그렇게 만들어진 result를 결과로써 내놓는다.
즉, add 함수는 입력받은 값을 더해주는 함수이다.
자, 함수를 만들었으니 이제 사용해 보자.
def add(x,y):
result = x + y
return result
val = add(1024, 5)
print(val)
# 실행결과
# 1029
add 함수에 1024와 5를 넣어서 얻은 값을 val이라는 변수에 넣는다.
그리고 그것을 출력해보면 1029가 나오는 것을 알 수 있다.
함수에 파라미터와 리턴은 필수가 아니다.
즉 파라미터가 없는 함수가 있을 수 있고 리턴이 없는 함수가 있을 수 있다.
2. 매개변수의 수가 일정치 않은 함수
매개변수를 몇개나 받을지 알 수 없는 경우, 다음과 같이 사용할 수 있다.
def add(*args):
result = 0
for i in args:
result += i
return result
print(add(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15))
print(add(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35))
# 실행결과
# 120
# 630
add 함수는 받은 파라미터 값을 전부 더하는 함수다
아래 print에서 add 함수를 호출하고 있는데 보시다시피 파라미터를 잔뜩 넣는 것을 알 수 있다.
그러나 얼마나 많은 파라미터를 넣든, 받은 파라미터를 전부 더해서 그 결과를 출력하는 것을 볼 수 있다.
3. 간단한 계산기 만들기
위 함수기능과 조건문을 활용해 계산기를 만들어 보자
def calc (option, *args):
result = 0
if option == 'add':
for i in args:
result += i
elif option =='sub':
result = args[0]
for i in args[1:]:
result -= i
elif option == 'mul':
result = 1
for i in args:
result *= i
elif option == 'div':
result = args[0]
for i in args[1:]:
result /= i
return result
더하기, 빼기, 곱하기, 나누기 기능을 갖춘 계산기가 완성되었다.
calc 함수에서 option에 무엇을 사용할지 작성하고 계산하고자 하는 인자를 넣어주면 된다.
위 함수는 아래 처럼 사용할 수 있다.
print(calc('add', 4, 3, 7))
print(calc('mul', 42, 128))
print(calc('sub', 8, 7, 17))
print(calc('div', 5, 32))
# 실행결과
# 14
# 5376
# -16
# 0.15625
단, 이 계산기는 0으로 나누면 에러가 발생한다.
이런건 예외처리를 해주어야 하는데 이는 다음에 알아보자
4. 여러개 리턴하기
파라미터와는 다르게 리턴값의 수는 가변형이 될 수 없지만 여러개를 리턴하는 것은 가능하다.
이 기능을 사용하여 위 계산기의 복잡한 코드를 훨씬 간결하게 줄일 수 있다.
아래 코드를 참조하자
def new_calc(x,y):
return (x * y , x / y, x+y, x-y)
res1, res2, res3, res4 = new_calc(42,128)
print(res1,res2, res3, res4)
이 mul_and_div 함수는 값을 두 개 입력받으면 그 두 수를 곱한 값과 나눈 값과 더한 값, 뺀 값 4 개를 반환한다.
그리고 res1, res2, res3, res4 변수에 그 값들을 각각 할당하고
print를 통해서 출력한다.
아까 만든 계산기 코드보다 훨씬 간결한 것을 볼 수 있다.
5. 지역변수와 전역변수
변수는 그 변수가 영향을 끼치는 범위가 있다. 아래 코드를 보자
a = 1
def vartest(a):
a = a + 1
return a
a = vartest(a)
print(a)
# 실행결과
# 2
여기서는 a라는 변수만 사용되었다.
그런데 a 변수가 이름만 같을 분 vartest 함수 내의 a는 함수 밖의 a와는 별개의 변수다.
a변수는 1이라고 정의했다.
그리고 그 a 변수는 vartest함수에서 내놓은 값을 새로 받기로 했다.
vartest 함수는 1이라는 값을 받았다.
그리고 내부 코드에 의해 1이 증가되었고 그렇게 증가된 값 2를 리턴한다.
고로 a변수는 2가 된다.
찬찬히 읽어봤으면 알겠지만 함수 내의 a와 밖의 a는 별개의 변수라는 것을 알 수 있다.
이렇게 함수 내에서만 사용하는 변수가 지역변수, 밖에서 사용되는 것을 전역변수라고 한다.
그렇다면 함수 안에서 함수 밖의 a를 쓰고자 한다면 어떻게 할까?
a = 1
def vartest():
global a
a = a + 1
return a
a = vartest()
print(a)
파라미터의 a를 없애주고 global 키워드를 사용해서 함수 밖의 a값을 가져왔다.
이제 vartest안의 a값은 함수 밖의 a값을 가져와서 사용한다.
만약 파라미터의 a를 없애주지 않을 경우, 컴퓨터가 어느쪽이 메인 a값인지 알지 못해 에러가 발생한다.
6. 람다 함수
한 번 쓰고 버릴 함수를 람다 함수라고 한다.
굳이 왜 쓰는지는 모르겠지만 일단 알아두자
# 일반함수
def add(x,y):
return x+y
print(add(7,4))
# 람다함수
print((lambda x,y: x+y)(7,4))
위 코드에서, 일반함수나 람다함수나 기능은 똑같다.
물론 람다함수는 저 프린트 문 안에서 사용하고 그대로 끝이다.
굳이 이런게 필요한지는 모르겠으나 만약 코드가 길어지면서 함수가 많아지거든 이런 람다 함수를 써야할 경우가 있을 수도 있으리라 본다.
7. 내장함수
파이썬 공식 홈페이지에 들어가면 파이썬에서 지원하는 내장함수의 종류에 대해서 알 수 있다.
https://docs.python.org/3/library/functions.html
P항목에 print()가 있는 것을 볼 수 있는데 이를 통해, print도 엄연히 함수라는 것을 알 수 있다.
이 많은 것들을 다 다루지는 않고 필요할 때마다 하나씩 학습하면 된다.
이 부분은 다음에 기회가 되면 다루어 보자
'Language > Python' 카테고리의 다른 글
Python 공부정리 - 객체지향, 클래스 (0) | 2023.02.02 |
---|---|
Python 공부정리 - 가상환경 (0) | 2023.02.02 |
Python 공부정리 - 흐름제어(if, for, while) (0) | 2023.02.01 |
Python 공부정리 - 연산자, 문자열 포맷팅 (0) | 2023.01.31 |
Python 공부정리 - 변수, 자료형 (0) | 2023.01.31 |