매개변수(parameter)는 함수를 만들 때 괄호 안에 적는 이름이고, 인자(argument)는 부를 때 괄호 안에 넘기는 값입니다. 함수를 부르면 새 칸이 생기고, 그 칸에서 매개변수가 넘긴 인자에 붙습니다.
앞 레슨의 greet()는 부를 때마다 같은 인사만 찍었습니다. 괄호 안에 매개변수를 두면 한 함수가 부를 때마다 다른 값으로 일합니다. print('커피')에서 괄호 안에 넘긴 '커피'도 인자였습니다.
이 레슨에서는 매개변수가 어느 칸에서 어떤 값에 붙는지 봅니다.
1부르면 매개변수가 인자에 붙는다
그림의 코드입니다.
def greet(name):
print(name, '님')
greet('민지')
민지 님5번 줄은 greet에 인자 '민지'를 넘겨 부릅니다. 새 칸이 생기고, 그 칸에서 매개변수 name이 '민지'에 붙습니다(규칙 5). 그래서 2번 줄은 name이 붙은 '민지'로 민지 님을 찍습니다.
greet의 몸에는 return이 없어, 몸이 끝나면 greet는 None을 돌려줍니다. 앞 레슨의 double이 돌려준 것은 8이었지만, print만 하는 greet가 돌려주는 것은 None입니다. 2번 줄이 찍은 민지 님은 화면에 쓴 글자일 뿐입니다.
함수가 끝나면 칸이 사라지고, 칸에 생긴 이름 name도 함께 사라집니다.
2부를 때마다 새 칸에서 다시 붙는다
같은 함수를 인자를 바꿔 두 번 부릅니다. 무엇이 찍힐까요? 답을 정한 뒤 펼쳐 보세요.
def greet(name):
print(name, '님')
guest = '준호'
greet('민지')
greet(guest)
실행 결과 보기
민지 님
준호 님예상과 다르면 그곳이 배울 곳입니다. 6번 줄이 부르면 새 칸에서 name이 '민지'에 붙고, 7번 줄이 부르면 또 새 칸이 생겨 name이 '준호'에 붙습니다. 칸은 부를 때마다 새로 생겼다가 사라지므로, 앞 칸의 name이 남지 않습니다. 7번 줄은 괄호 안의 guest를 먼저 계산해, guest가 붙은 값 '준호'를 넘깁니다. 함수에 넘어가는 것은 이름 guest가 아니라 그 값입니다. 그래서 바깥 이름이 매개변수 이름과 달라도 됩니다.
3매개변수가 둘이면 차례대로 짝지어진다
매개변수는 쉼표로 나눠 여럿 둘 수 있고, 부를 때도 인자를 쉼표로 나눠 넘깁니다.
def order(item, qty):
print(item, qty)
order('라테', 2)
order(2, '라테')
라테 2
2 라테인자는 적은 차례대로 매개변수와 짝지어집니다. 5번 줄은 item이 '라테', qty가 2에 붙고, 6번 줄은 차례가 바뀌어 item이 2, qty가 '라테'에 붙습니다. 이렇게 차례로 짝지어지는 인자를 위치 인자(positional argument)라고 합니다. 파이썬은 item이 메뉴라는 뜻을 모르고 차례만 봅니다(규칙 6).
인자가 모자라면 붙을 값이 없는 매개변수가 생겨 오류가 납니다.
def order(item, qty):
print(item, qty)
drink = '커피'
order(drink)
Traceback (most recent call last): File "main.py", line 6, in <module> order(drink) ~~~~~^^^^^^^TypeError: order() missing 1 required positional argument: 'qty'맨 아래 줄은 'order()에 꼭 있어야 할 위치 인자 하나가 빠졌다'는 뜻이고, 끝의 'qty'는 붙을 값이 없는 매개변수입니다. order(drink, 1)처럼 인자를 둘 넘기면 됩니다.
예제
영수증 한 줄 찍기
인자 자리에는 식도 쓸 수 있습니다. 식을 먼저 계산한 값 하나가 넘어갑니다.
def receipt(item, won):
print(f'{item} {won}원')
receipt('커피', 4000)
receipt('라테', 4500 * 2)
커피 4000원
라테 9000원6번 줄은 4500 * 2를 계산한 9000을 넘겨, 새 칸에서 won이 9000에 붙습니다(규칙 2).
자주 틀리는 곳
틀린 생각: 함수 안에서 찍은 글자가 부른 자리로 돌아온다.
화면에 민지 님이 보이니 그 글자가 함수의 결과처럼 보입니다. 화면에 쓰는 일과 값을 돌려주는 일은 다릅니다.
def greet(name):
print(name, '님')
x = greet('민지')
print(x)
민지 님
None민지 님은 2번 줄이 화면에 쓴 것이고, x가 붙은 값은 greet가 돌려준 None입니다.
맞는 규칙: 함수 안의 print는 화면에 쓸 뿐이고, 값을 돌려받는 것은 return입니다. return이 없는 함수를 부른 자리에는 None이 돌아옵니다(규칙 5).
틀린 생각: 바깥에서 매개변수와 같은 이름을 써야 함수에 값이 넘어간다.
def greet(name):과 짝을 맞추려면 부르는 쪽에도 name이 있어야 할 것처럼 보입니다. 넘어가는 것은 이름이 아니라 값입니다.
def greet(name):
print(name, '님')
guest = '준호'
greet(guest)
준호 님6번 줄은 guest가 붙은 '준호'를 넘기고, 새 칸의 name이 그 값에 붙습니다. 바깥에는 name이라는 이름이 없습니다.
맞는 규칙: 부를 때 넘어가는 것은 괄호 안을 계산한 값이고, 매개변수는 새 칸에서 그 값에 붙습니다. 그래서 바깥 이름은 매개변수와 달라도 되고 없어도 됩니다(규칙 5).
틀린 생각: 인자를 어떤 차례로 넘겨도 파이썬이 뜻에 맞는 매개변수와 짝지어 준다.
이름이 item, qty라 메뉴는 item에, 수는 qty에 갈 것처럼 보입니다. 파이썬은 이름의 뜻을 모릅니다.
def order(item, qty):
print(item, qty)
order(3, '녹차')
3 녹차첫째 매개변수 item이 첫째 인자 3에 붙었습니다.
맞는 규칙: 위치 인자는 이름의 뜻이 아니라 적은 차례대로 매개변수와 짝지어집니다. 인자는 def 줄의 매개변수 차례대로 넘깁니다(규칙 6).
확인 문제
1. 예제 코드의 6번 줄을 receipt('라테', 4500 + 500)으로 바꿨습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
def receipt(item, won):
print(f'{item} {won}원')
receipt('커피', 4000)
receipt('라테', 4500 + 500)
힌트
6번 줄에서 둘째 인자 자리의 식을 먼저 계산하고, 그 값에 어느 매개변수가 붙는지 봅니다.
정답
커피 4000원
라테 5000원6번 줄은 4500 + 500을 계산한 5000을 넘기고, 새 칸에서 won이 5000에 붙습니다.
흔한 오답은 라테 4500 + 500원입니다. 인자 자리의 식이 계산되지 않고 글자처럼 넘어간다고 본 것입니다(식이 저장된다는 생각). 넘어가는 것은 식을 계산한 값 하나입니다(규칙 2).
2. 빈칸을 채워 코드를 완성하세요.
(가) 낸 돈과 값을 받아 거스름돈을 돌려주는 함수입니다. 아래 두 줄이 찍히도록 '2. 계산하기'의 빈칸을 채우세요.
5500
1500
# 1. 받을 값 정하기
def change(paid, price):
# 2. 계산하기
left = ____
# 3. 돌려주기
return left
print(change(10000, 4500))
print(change(5000, 3500))
힌트
9번 줄에서 paid와 price가 각각 어느 인자에 붙는지 먼저 적습니다.
정답
paid - price입니다.
# 1. 받을 값 정하기
def change(paid, price):
# 2. 계산하기
left = paid - price
# 3. 돌려주기
return left
print(change(10000, 4500))
print(change(5000, 3500))5500
1500빈칸에 5500을 바로 쓰면 첫 줄은 맞지만, 둘째 줄도 5500이 찍혀 1500이 되지 않습니다. 인자가 바뀌면 따라 바뀌도록 매개변수로 계산합니다.
흔한 오답은 price - paid입니다. -5500과 -1500이 찍힙니다. price가 10000에 붙는다고 본 것입니다. 첫째 매개변수 paid는 첫째 인자 10000에 붙습니다(규칙 6).
(나) 함께 낸 금액을 사람 수로 나누는 함수입니다. 아래 두 줄이 찍히도록 '1. 받을 값 정하기'를 통째로 채우세요.
4000
2500
# 1. 받을 값 정하기
# 2. 계산하기
each = total // people
# 3. 돌려주기
return each
print(share(12000, 3))
print(share(10000, 4))
힌트
빈 줄에는 def 줄 하나가 들어갑니다. 함수 이름은 9번 줄에, 매개변수 이름은 4번 줄에 있습니다.
정답
# 1. 받을 값 정하기
def share(total, people):
# 2. 계산하기
each = total // people
# 3. 돌려주기
return each
print(share(12000, 3))
print(share(10000, 4))4000
2500total이 9번 줄의 첫째 인자 12000에, people이 둘째 인자 3에 붙어야 12000 // 3 = 4000입니다.
흔한 오답은 def share(people, total):입니다. people이 12000, total이 3에 붙어 3 // 12000을 계산하므로 0이 두 번 찍힙니다. 매개변수를 어떤 차례로 적어도 뜻에 맞는 인자와 짝지어진다고 본 것입니다(이름이 뜻을 정한다는 생각). 매개변수는 인자를 넘기는 차례대로 적습니다(규칙 6).
3. 요일과 걸음 수를 찍으려 했는데 결과가 이상합니다. 몇 번 줄을 어떻게 고쳐야 할까요?
월 5000걸음
위처럼 찍혀야 하는데, 실제로는 아래처럼 찍혔습니다.
def walk(day, steps):
print(day, f'{steps}걸음')
walk(5000, '월')
5000 월걸음힌트
5번 줄의 인자 둘이 1번 줄의 매개변수와 어떤 차례로 짝지어지는지 봅니다.
정답
5번 줄을 walk('월', 5000)으로 고칩니다.
def walk(day, steps):
print(day, f'{steps}걸음')
walk('월', 5000)월 5000걸음고치기 전에는 첫째 매개변수 day가 첫째 인자 5000에, steps가 '월'에 붙었습니다. 인자는 뜻이 아니라 차례대로 짝지어집니다(규칙 6).
다르게 고쳐도 되는 곳: 1번 줄을 def walk(steps, day):로 바꿔도 같은 줄이 찍힙니다. 다만 부르는 곳이 여럿이면 모두 그 차례를 따라야 하니, 부르는 줄을 고치는 쪽이 고칠 곳이 적습니다.
흔한 오답은 2번 줄을 print(steps, f'{day}걸음')으로 바꾸는 것입니다. 찍는 2번 줄이 고칠 곳이라고 본 것입니다. 찍히는 글자는 맞지만 day는 여전히 5000에 붙어 있어, 다른 곳에서 walk('화', 3000)처럼 바르게 부르면 거꾸로 찍힙니다.
5번 줄 위에 name = '준호'를 한 줄 더하면 무엇이 찍히는지 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.