python에서 함수란 입력 값이 주어졌을 때 내가 원하는 결과 값을 반환하는 기능입니다. 이는 우리가 중학교, 고등학교 수학시간에 배웠던 함수와 동일합니다. python에서 함수를 잘 쓸 수 있게 되면 동일한 코드를 반복해서 만들지 않아도 됩니다. 만약 내가 100개의 와플을 굽는다고 했을 때 100개 만큼의 반죽을 처음에 만들고 시작하면 매번 구울 때마다 와플 가루와 물을 섞을 필요가 없습니다. 단지 와플을 구울 때 마다 반죽을 틀에 붓기만 하면 되죠.

제가 python의 첫 컨텐츠로 함수를 선택한 이유는 함수를 이해하는 것이 프로그래밍을 깊게 이해하는데 큰 도움이 되기 때문입니다. 자 이제 함수를 본격적으로 알아봅시다!

함수의 형태

def 함수명(매개변수):
	<수행할 문장1>
    	<수행할 문장2>
    ...

def는 python에서 함수를 만들 때 사용하는 예약어입니다. 예약어란 말 그대로 python에게 '내가 이제 함수를 만들거야'라고 미리 알려주는 것입니다. 매개변수는 함수에 입력으로 전달받는 변수를 말합니다. 와플을 굽는다고 했을 때 와플 반죽이 매개변수가 되는 것입니다. 이후 print, if, while, return 등 여러 함수를 넣어 내가 원하는 기능을 만듭니다. <수행할 문장>을 통해 내가 원하는 모양과 갯수의 와플을 만드는 것이라고 생각하시면 됩니다.

def mul(a, b):
	return a*b

 이 함수는 다음과 같이 해석할 수 있습니다. "add라는 함수에 a와 b가 입력되면 a*b를 반환해줘."

여기서 return은 결괏값을 돌려주는 명령어입니다.

def mul(a,b):
	return a*b
    
c = mul(3,4)
print(c)

# 12

위 코드를 해석해보겠습니다. 먼저 함수를 선언해줍니다. 'mul'이라는 함수는 a와 b가 입력되면 a*b라는 결괏값을 반환해줍니다. c라는 변수에 mul함수를 선언하고 매개변수로 3과 4를 전달했습니다. c를 출력해보면 12라는 결과값이 나오게 됩니다.

 

매개변수와 인수

매개변수와 인수의 차이점은 저도 이번에 공부하면서 정확히 알게 되었습니다.

매개변수는 함수의 입력으로 전달하는 값이고, 인수는 함수를 호출할 때 사용하는 값입니다.

def mul(a,b):
	return a*b
# a와 b는 매개변수

print(mul(3,4))
# 3과 4는 인수

 

입력 값과 리턴 값에 따른 함수의 형태

함수는 어떤 입력을 넣으면 가공해서 내가 원하는 결괏값을 반환해줍니다.

이러한 함수의 형태는 입력값과 결괏값에 따라 4가지 형태로 나눠집니다.

일반적인 함수

입력값이 있고 결괏값이 반환되는 함수가 일반적인 함수입니다. 우리가 대부분 만들고 접하게 될 함수입니다.

def 함수이름(매개변수):
	<수행할 문장>
    	...
    	return 리턴값

다음의 형태가 가장 일반적인 함수입니다.

def mul(a,b):
	result = a*b
    	return result

다음 함수는 a와 b를 매개변수로 입력 받아 result라는 값을 최종적으로 반환하는 함수입니다. a와 b라는 입력 값이 있고 return 명령어를 사용해 반환하는 값도 분명합니다. 이러한 함수는 다음과 같이 사용할 수 있습니다.

c = mul(3,4)
print(c)

# 12

리턴받을 변수 = 함수((매개변수1, 매개변수2, ...))

 

입력 값이 없는 함수

def say_hi():
	return 'Hi'

이 함수는 입력하는 매개변수가 없고 결괏값으로만 'hi'를 반환합니다.

a = say()
print(a)

# Hi

위 함수도 사용법은 일반적인 함수와 동일합니다. 다른 점은 매개변수로 특정한 값을 전달하지 않아도 결괏값이 반환된다는 것입니다. 단순히 'Hi'를 출력하는데 연산은 필요없으므로 매개변수를 입력받지 않은 것입니다.

 

리턴 값이 없는 함수

def mul(a,b):
	print(f'{a}와 {b}의 곱은 {a*b}입니다.')
    
mul(4,3)
# 4와 3의 곱은 12입니다.

이 함수는 return 명령어를 사용하지 않았습니다. 그래도 결괏값을 반환합니다. return이 없어도 print 함수를 통해 문장이 출력될 수 있습니다. print 구문은 <수행할 문장>에 해당하기 때문에 엄밀히 리턴값이 아닙니다. 리턴값은 오직 return을 사용해야만 합니다.

진짜 return이 없다고 python이 인식했는지 알아보겠습니다.

a = mul(3,4)
print(a)
# None

a라는 변수에 함수를 선언한 후 print를 사용해 결과값을 확인해보면 None이 나옵니다. return이 포함된 일반적인 함수에서는 변수에 함수를 선언한 후 print를 사용하면 return 값이 반환되었지만 위 함수의 경우에는 반환되지 않습니다.

 

입력값도 리턴값도 없는 함수

def say_hi():
	print('Hi')
say_hi()
# Hi

 위 함수는 입력으로 전달하는 매개변수도 없고 return도 없으니 입력도 리턴값도 없는 함수입니다. 이런 함수를 사용하기 위해서는 함수를 선언하기만 하면 됩니다.

 

몇 개의 입력값을 받을지 모를 때는 어떻게 해야할까?

def mul_many(*args):
	result = 1
	for i in args:
    		result *= i
    	return result

코드를 짤 때 우리는 몇 개의 매개변수를 함수에 전달할지 모르는 경우가 있습니다. 이럴 때 *args를 사용하면 됩니다. args는 arguments의 약자로 여러 매개변수를 전달 받는다는 것을 의미합니다. 위 코드는 몇 개의 매개변수가 전달되던 간에 매개변수들을 모두 곱한 값을 반환하는 함수입니다.

다음은 이 함수를 응용한 예제입니다.

def add_mul(choice, *args):
	if choice == 'add':
    	result = 0
        for i in args:
        	result += i
            
    else:
    	result = 1
        for i in args:
        	result *= 1
            
    return result

위 함수는 choice 매개변수에 add나 mul을 전달할 수 있습니다. 그리고 add를 전달할 경우에는 모든 매개변수를 더하고 mul을 전달할 경우에는 모든 매개변수를 곱합니다.

result = add_mul('add', 1,2,3,4,5)
print(result)
# 15
result = add_mul('mul', 1,2,3,4,5)
print(result)
# 120

키워드 매개변수 kwargs

kwargs는 입력받은 매개변수를 딕셔너리 형태로 출력하는 기능을 합니다.

def print_kwargs(**kwargs):
	print kwargs
    
print_kwargs(a=1)
# {'a':'1'}
print_kwargs(age=27, name='Shawn')
# {'age':'27', 'name':'Shawn)

 

함수의 return 값은 언제나 하나이다.

def add_and_mul(a, b):
	return a+b, a*b
    
result = add_and_mul(3,4)

다음과 같은 함수를 만들게 되면 result는 (7,12)라는 tuple 값을 가지게 됩니다. 7, 12가 아닌 tuple로 하나의 값으로 만들어지게 되는 것입니다.

만약 두 개 값으로 나눠서 받고 싶다면 result 1과 result2처럼 두 개의 변수를 선언하면 7과 12를 나눠서 변수에 저장할 수 있습니다.

def add_and_mul(a, b):
	return a+b
    	return a*b
        
result = add_and_mul(3,4)
print(result)
# 7

이처럼 return을 두 가지만 사용하는 경우에는 어떻게 될까요? 이런 경우 함수는 가장 처음 return 값을 반환하게 됩니다. add_and_mul 함수의 경우 a+b 값을 반환하게 되겠네요.

 

return의 응용

def say_nick(nick):
	if nick == '바보':
    	return
    else:
    	print(f'nick의 별명은 {nick}입니다.')
        
say_nick('바보')
# None
say_nick('nikky')
# 'nick의 별명은 nikky입니다.'

return 문을 통해 함수를 빠져나가는 것은 실제 프로그래밍에서 자주 사용됩니다. 반복문에서 break를 사용해서 빠져나가는 것과 유사합니다. 위 함수의 경우 '바보'를 매개변수로 받으면 return 문을 만나 함수를 빠져나오고 아무 결괏값도 얻지 못합니다. 하지만 다른 단어를 입력하면 print 구문을 만나 결괏값을 얻게 됩니다. 

 

매개변수에 초깃값 미리 설정하기

def say_myself(name, age, man=True):
	print(f'my name is {name}')
    	print(f'my age is {age}')
    
    if man:
    	print('남자입니다.')
    else:
    	print('여자입니다.')
        
# 남자로 출력
say_myself(27, Shawn)
say_myself(27, Shawn, True)

#여자로 출력
say_myself(27, Shawn, False)

say_myself 함수는 이름과 나이를 입력 받으면 정보를 알려주는 문장을 출력하고 man이 True일 경우에는 '남자입니다.' 문장을 출력합니다. False일 경우 '여자입니다.'를 반환합니다. 위 예에서 say_myself 함수를 다음과 같이 사용할 수 있습니다. 

이 때 중요한 점은 인수의 순서를 지켜야한다는 점입니다. 마지막 man에 숫자를 넣게 되면 True로 반환되지 않아 에러 메세지가 나올 것입니다.

 

함수 안에서 선언한 변수의 효력 범위

a = 1
def vartest(a):
	a += 1

vartest(a)
print(a)
# 1

다음과 같이 vartest라는 함수를 선언했을 때 a를 출력하면 1이라는 결과가 나옵니다. a가 2가 나올 것 같지만 1이 나왔는데 왜 그럴까요? 바로 함수 안에서 선언된 a라는 변수는 1번째 코드에서 선언된 a라는 변수와 다른 변수이기 때문입니다. 함수 안에서 선언된 변수는 함수 안에서만 영향을 미치고 함수 밖에서는 영향을 미치지 못합니다.

 

함수 밖에 선언된 변수를 변경하는 법

a = 1

def vartest(a):
	a += 1
    return a

a = vartest(a)
print(a)

함수 안에서 선언된 변수를 함수 밖 변수에 전달하기 위해서는 return을 사용하면 됩니다. vartest 함수는 인수를 전달받고 인수의 1을 더한 값을 반환합니다. return을 사용했기 때문에 a라는 변수에 vartest 함수를 할당하면 a=1 값이 함수에 들어가서 나온 2를 최종적으로 a라는 변수에 새롭게 저장합니다.

 

lambda

lambda는 함수를 생성할 때 컴퓨터에게 함수를 생성할 것임을 미리 알려주는 def와 동일한 예약어 역할을 합니다. 보통 함수를 간결하게 만들 때 사용합니다. 사용법은 다음과 같습니다.

함수 명 = lambda 매개변수1, 매개변수2, ... : 표현식

add = lambda a, b: a+b
result = add(3,4)
print(result)
# 7

 

연습문제

  1. 짝수가 입력되면 '짝수'라는 문자열을, 홀수가 입력되면 '홀수'라는 문자열을 반환하는 함수를 만들어보세요.
  2. 윤년을 나타나는 수가 입력되면 '윤년'이라는 문자열을, 그렇지 않은 수가 입력되면 '평년'이라는 문자열을 반환하는 함수를 만들어보세요.
  3. 연도를 나타내는 숫자와 월을 나타내는 숫자를 입력하면 그 달의 날짜 수를 반환하는 함수 days2를 만들어보세요.
  4. 3개의 숫자를 입력하면 '그 숫자들의 합'과 '그 숫자들을 제곱한 숫자들의 합'의 차이(큰 수에서 작은 수를 뺀 값)를 계산하는 diffsum을 만든다. 큰 수에서 작은 수를 뺀 결과이므로 항상 0보다 크거나 0과 같아야 한다.
  5. 함수 바깥에 m 이라는 전역 변수를 만들고 그 값을 0으로 놓는다. 앞에서 만든 diffsum 함수를 고쳐서 diffsum 함수와 같은 값을 반환하지만 함수를 실행할 때 마다 diffsum 함수에서 계산된 값이 원래 있던 m보다 크면 m을 계산된 값으로 바꾸는 함수 diffsum2 를 만든다.
더보기

코드 정답

1번 문제

def calcul(number):
  if number % 2 == 0:
    print('짝수') 
  else:
    print('홀수')

2번 문제

def year(year):
  if (year % 4 ==0) & (year % 100 == 1) & (year % 400 == 0):
    return '윤년'
  else:
    return '평년'

3번 문제

def return_days(year, month):
  if year % 4 ==0:
    if month == 2:
      return '28일'

  if year % 4 != 0:
    if month == 2:
      return '29일'
      
# elif의 경우 앞의 if문이 만족되면 elif문은 확인하지 않고 종료하기 때문에 elif를 사용하면 안됩니다.
  if year % 4 != 0:
    if (month == 1) | (month == 3) | (month == 5) | (month == 7) | (month == 8) | (month == 10) | (month == 12):
      return '31일'
      
  if year % 4 != 0:
    if (month == 4) | (month == 6) | (month == 9) | (month == 11):
      return '30일'

4번 문제 정답

def diffsum(num1, num2, num3):
  return (num1**2 + num2**2 + num3**2)-(num1 + num2 + num3)

5번 문제 정답

m = 0

def diffsum2(num1, num2, num3):
  diffsum = (num1**2 + num2**2 + num3**2)-(num1 + num2 + num3)
  global m
  if diffsum > m:
    m = diffsum
  return m

'Coding Test' 카테고리의 다른 글

[python] 피자 나눠 먹기(2)  (0) 2023.03.02
[python] 최빈값 구하기  (0) 2023.02.24
[python] 중앙값 구하기  (0) 2023.02.24
[python] 분수의 덧셈  (0) 2023.02.22
[python] Class  (0) 2023.02.15

+ Recent posts