[Python] 함수
25 Jan 2020
Reading time ~6 minutes
함수란 주어진 입력에 대해 의도된 출력을 전달하는 것을 말합니다.sum, len, range
와 같은 것들은 파이썬에 기본적으로 탑재되어 있는 내장함수입니다.
# 내장함수의 예
a = [1, 3, 4, 6, 7]
print(list(range(1, 11)))
print(len(a))
print(sum(a))
# 출력:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5
21
개별 함수 정의하기
내장함수 이외에 별도로 코드를 작성하여 함수를 정의, 사용할 수 있습니다.
# 개별 함수의 정의
def 함수명(입력값1, 입력값2,...):
수행할 문장1
수행할 문장2
...
return 결과값
- 새로운 함수를 최초로 정의할 때, 위와 같이 첫 줄은
def
뒤에 함수명과 인자로 입력할 값을 정의하고 콜론으로 끝을 냅니다. - 이후 들여쓰기로 실행할 코드들을 정의해줍니다.
- 주어진 명령들을 수행하고 결과값을 전달하기 위해
return
을 사용합니다. - 함수의 명칭은 어떤 기능을 하는 함수인지 알 수 있게 작성하는 것이 좋습니다.
def add(x, y):
n = x + y
return n
add(30, 300)
# 출력:
330
함수의 입력값(parameter)
함수의 입력값은 복수일 수도 있고, 필요하지 않을 수도 있습니다. int, string, boolean 등 어떤 유형의 파이썬 객체도 전달 가능하며 다른 함수도 입력값이 될 수 있습니다.
다만, 입력값에 대한 타입명시를 하지 않으므로, 의도된 타입에 맞게 입력을 잘 해주어야 합니다.
# 입력값이 없어도 함수를 수행할 수 있다.
def test():
print('haha')
print('good')
return 100
# 출력:
haha
good
100
def substract(x, y):
sub = x - y
return sub
a = substract(10, 20)
print(a)
# 출력:
-10
# 함수는 처음 의도한 데이터의 유형대로 파라미터 입력을 잘해야한다.
# 아래의 코드는 에러가 발생합니다.
substract('you', 'me')
기본 파라미터(default parameter)
함수의 입력값에 기본값을 지정하여 별도의 입력값이 없을 경우, 기본값으로 수행이 되게 할 수 있습니다.
def add(x, y, z = 5):
a = x + y + z
return a
print(add(10, 30, 20))
print(add(10, 30))
# 출력:
60
45
(예시) print( ) 함수의 기본 파라미터 : sep, end 등의 파라미터가 있습니다.
print(value, ..., sep = ' ', end = '\n')
# sep의 기본은 한 칸 띄워쓰기, end의 기본은 한 줄 띄우기
print(1, 2, 3)
print(2, 3, 4)
# 출력:
1 2 3
2 3 4
print(1, 2, 3, sep = '!') # 한 칸 띄워쓰기 대신에 사이에 ! 입력
print(2, 3, 4, end = '%%%') # 한 줄 띄우기 대신에 %%% 입력
print(4, 5, 6)
# 출력:
1!2!3
2 3 4%%%4 5 6
기본 파라미터 뒤에는 일반 파라미터가 위치할 수 없습니다.
def test(a, b, c = 1):
print(a, b, c)
test(10, 20, 1)
# 출력:
10 20 1
# 기본 파라미터는 중간에 위치할 수 없어, 오류가 발생합니다.
def test(a, b = 1, c):
print(a, b, c)
test(10, 20, 1)
함수의 파라미터 값을 전달할 때, 파라미터 이름을 명시하여 전달할 수 있습니다.
이 때, 함수 정의와는 다른 순서로 값을 입력할 수 있습니다. 파라미터 이름을 적지 않으면 기본 정의 순서대로 값을 전달합니다.
def test(x, y, z):
a = x * y + z
return a
test(10, 20, 3)
# 출력:
203
# 파라미터 이름을 같이 적어주면 입력순서를 바꿀 수 있다.
test(x = 10, z = 20, y = 3)
# 출력:
50
return
return
은 기본적으로 함수의 종료를 나타냅니다.
- return 옆에 값이나 수식이 있다면, 해당 값을 반환합니다.
- return 만 존재한다면, None을 반환합니다.
- return이 없는 경우, 함수 코드블록이 끝나면 종료로 간주하고, 이 때 None을 반환합니다.
def weird_multiply(x, y):
if x > 10 :
return x.* y
return (x + 2) * y
print(x + y) # return 이후에는 함수가 종료되기 때문에 이 줄은 실행되지 않습니다.
print(weird_multiply(1, 5))
print(weird_multyply(12, 5))
# 출력:
15
60
def weird_multiply(x, y):
if x > 10:
return
print(x + y)
return (x + 2) * y
print(weird_multiply(12, 5))
# 출력:
None
# return이 없으면, 함수 코드블록이 끝나면 종료로 인식합니다.
def weird_multiply(x, y):
if x > 10:
return x * y
print(weird_multiply(2, 5))
# 출력:
None
복수 값 반환
return 뒤에 여러 결과들을 콤마로 나열하면 튜플로 반환합니다.
def add_mul(x, y):
s = x + y
m = x * y
return s, m
c = add_mul(3, 5)
print(type(C))
c
# 출력:
<class 'tuple'>
(8, 15)
변수의 범위
함수 안의 변수는 자신이 속한 코드블록이 종료되면 소멸됩니다. 이렇게 특정 코드블록 안에서 선언된 변수를 지역변수(local variable)라고 합니다. 반대로 상단에서 정의되어 프로그램 종료 전까지 유지되는 변수를 전역변수(global variable)이라 합니다.
같은 이름으로 지역변수와 전역변수가 존재할 경우, 지역변수의 우선순위가 더 높습니다.
# 전역변수
num1 = 10
num2 = 30
# 하단의 num1, num2는 지역변수, 이 함수 코드블록 안에서만 유효한 변수입니다.
def test(num1, num2):
print(num1, num2)
return num1 + num2
print(test(30, 40))
# num1은 30으로 업데이트 되지 않고, 전역변수 값인 10
print(num1)
# num1은 40으로 업데이트 되지 않고, 전역변수 값인 30
print(num2)
# 출력:
30 40
70
10
30
입력 파라미터를 복수로 설정하기
함수 설정 시 입력 파라미터의 개수를 하나가 아니라 여러 개로 설정할 수 있습니다.(예시: print( )
)
# print 함수의 경우 파라미터 개수가 유동적이다
print(1)
print(1, 2)
print(1, 2, 3)
# 출력:
1
1 2
1 2 3
(1) *args (arguments)
*
뒤에 파라미터 명을 적어주면 해당 파라미터는 튜플로 인식되며, 복수의 입력값을 전달할 수 있습니다.*
뒤에 무엇이라 적든 기능상의 문제는 없지만 관례상 *arg
라고 적어줍니다.
# *args 를 활용하면 입력 파라미터를 튜플로 인식한다
def test(*x):
print(type(x))
print()
print(10, 20, 'string')
# 출력:
<class 'tuple'>
<class 'tuple'>
# 입력값을 하나의 튜플로 인식하고 튜플 내 개별 값에 대한 결과를 출력합니다.
def test(*args):
for item in args:
print(item)
test(10, 20, 30, 40)
# 출력:
10
20
30
40
(2) **kwargs (keyword arguments)
**
뒤에 파라미터 명을 적어주면 해당 파라미터는 딕셔너리로 인식됩니다.
이를 활용해서 파라미터의 이름과 값을 함께 전달할 수 있습니다,**
뒤에 무엇이라 적든 기능상의 문제는 없지만 관례상 *kwarg
라고 적어줍니다
# 입력되는 파라미터를 딕셔너리로 인식합니다.
def test2(**x):
print(type(x))
print(test2())
print(test(a = 1, b = 2, c = 3, d = 4, name = 'Bob'))
# 출력:
<class 'dict'>
<class 'dict'>
# keyword arguments로 입력 파라미터를 정의하면
# 파라미터의 이름도 같이 적어주지 않으면 에러가 발생합니다.
# 아래의 코드를 실행하면 에러가 발생합니다.
test2(1, 2, 3, 4)
def test2(**kwargs):
for key, value in kwarg.items():
print('key: ', key, ', value: ', value)
test2(a = 1, b = 2, c = 3, d = 4, game = 'chaos', name = 'Bob')
# 출력:
key: a, value: 1
key: b, value: 2
key: c, value: 3
key: d, value: 4
key: game, value: chaos
key: name, value: Bob
복수의 입력 값을 넣는 대표적인 예가 문자열 포맷 함수입니다.
※ 문자열 포맷 함수 : 여러가지 값과 포맷을 이용하여 문자열을 정의하는 함수로 { }
를 문자열 내 위치시켜서, 해당위치에 format 함수로 전달된 값을 넣어 문자열을 생성합니다.
a = '기온: 30도, 강수확률: 60%'
print(a)
# 출력:
기온 : 30도, 강수확률: 60%
# 포맷함수를 사용하여 동일 내용 출력하기
a = '기온: {}도, 강수확률: {}%'.format(30, 60)
print(a)
# 출력:
기온: 30도, 강수확률: 60%
a = '기온: {today_temp}도, 강수확률: {today_prob}%'.format(today_temp = 30, today_prob = 60)
print(a)
# 출력:
기온: 30도, 강수확률: 60%
(연습문제) 주어진 숫자의 소수 여부를 판별하는 함수 작성하기
def is_prime(num):
for i in range(2, num):
if num % i == 0 :
return False # 소수가 아니면 False를 반환
return True
print(is_prime(100))
print(is_prime(89))
print(is_prime(17))
# 출력:
False
True
True
(연습문제) 2와 해당 숫자 사이의 소수가 몇개인지 출력하는 함수 작성하기
def num_prime(num):
count = 0
for i in range(2, num+1):
if is_prime(i):
count += 1
return count
print(num_prime(7))
print(num_prime(100))
# 출력:
4
25
Reference
- 패스트캠퍼스 파이썬 강의