3.3 함수 정의하기에서 매개변수에 관해 설명할 때, 함수를 호출할 때는 함수에 정의된 매개변수의 개수만큼 순서대로 값을 전달해야 한다고 했다. 그것이 기본 규칙이다. 그런데 매개변수에 전달할 값을 생략하거나, 순서를 원하는대로 바꿀 수 있게 할 수도 있다. 함수를 정의할 때 조금 신경을 써서 함수 호출을 더 유연하게 만들어 보자.

3.5.1 매개변수 기본값 정의하기

함수 중에는 매개변수의 수가 고정되어 있지 않고 데이터를 한 개, 또는 두 개 전달받는 함수도 있다. 자리를 지정해 반올림하는 round() 함수가 대표적이다.

코드 3-15 반올림 자리를 지정할 수 있는 round() 함수

>>> round(3.1415)     # 매개변수를 하나만 전달
3

>>> round(3.1415, 2)  # 두 번째 매개변수로 반올림 자리 지정
3.14

이렇게 매개변수를 선택적으로 전달할 수 있게 하려면 어떻게 해야 할까? 비밀은 매개변수에 값이 전달되지 않았을 때 사용할 기본값(default value)을 정의해 두는 것이다. 다음 예제를 대화식 셸에 따라 입력해 보자.

코드 3-16 매개변수의 기본값 정의하기

>>> def divide(number, by=2):
...     """수(number)를 나눌 수(by)로 나눈다."""
...     return number / by
... 
>>> divide(12)   # 값을 하나만 전달하면, 두번째 매개변수가 2로 계산된다
6.0

>>> divide(12, 3)  # 두 번째 매개변수를 지정할 수도 있다
4.0

위 코드의 divide() 함수 정의를 자세히 보면, by 매개변수에 =2 라는 표기가 덧붙여져 있다. 이렇게 매개변수 정의에 등호와 값을 적으면 그 값이 매개변수의 기본값이 된다. 기본값이 정의된 매개변수에는 함수를 호출할 때 값을 생략할 수 있다. 이 때 생략된 매개변수에는 기본값이 대입된다.

기본값을 갖는 매개변수의 위치

단, 매개변수에 값을 전달할 때는 위치를 기준으로 하기 때문에 더 앞에 있는 매개변수에 기본값을 지정했다면 뒤에 있는 변수에도 기본값을 지정해야 한다. 그렇지 않으면 함수를 호출할 때 어떤 매개변수를 생략한 것인지 알 수 없게 되기 때문이다.

코드 3-17 매개변수 기본값을 잘못 정의한 경우

>>> def multiply(a=2, b):
...     """a와 b의 곱을 계산한다."""
...     return a * b
...
SyntaxError: non-default argument follows default argument

위 코드의 multiply 함수는 먼저 정의된 매개변수 a에만 기본값이 정의되었고, 뒤따라 정의된 b에는 기본값이 정의되지 않았다. 이 함수를 호출할 때 값을 하나만 전달한다면, 생략한 변수가 a인지 b인지 알 수 없기 때문에 이 함수는 정의할 수 없고, 파이썬은 오류를 발생시켜 이 문제를 알려주었다. 다음과 같이 매개변수 b에도 기본값을 정의해 주면 오류가 발생하지 않는다.

코드 3-18 올바르게 수정한 함수

>>> def multiply(a=2, b=4):
...     """a와 b의 곱을 계산한다."""
...     return a * b
... 
>>> multiply()       # 두 매개변수 모두 생략
8

>>> multiply(8)      # 두 번째 매개변수 생략
32

>>> multiply(8, 16)  # 값을 모두 지정
128

개념 정리

  • 매개변수에 기본값을 지정할 수 있다.
  • 기본값이 지정된 매개변수에는 인자를 전달하지 않아도 된다.

3.5.2 매개변수를 지정해 값 전달하기

매개변수가 여러 개인 함수를 호출할 때, 함수에 전달한 값은 하나씩 차례대로 전달된다. 그걸 기본 규칙으로 하되, 전달 순서를 바꾸거나 필요한 매개변수만 골라 값을 전달할 수도 있다. 함수를 호출할 때 값을 전달받을 매개변수를 지정하면 된다. 다음 코드를 대화식 셸에 따라 입력해 보자.

코드 3-19 동전계산

>>> def 동전계산(오백원=0, 백원=0, 오십원=0, 십원=0):
...     """동전의 개수를 입력받아 돈의 합계를 계산한다."""
...     return 오백원 * 500 + 백원 * 100 + 오십원 * 50 + 십원 * 10
... 
>>> 동전계산()                   # 기본값은 모두 0
0

>>> 동전계산(1, 10, 0, 100)      # 값을 순서대로 전달
2500

>>> 동전계산(십원=220)           # 십원짜리만 220개
2200

>>> 동전계산(백원=3, 오십원=2)   # 백원 3개, 오십원 2개
400

>>> 동전계산(백원=9, 오백원=10)  # 백원 9개, 오백원 10개
5900

위 코드의 동전계산() 함수는 모든 매개변수의 기본값이 0으로 정의되어 있다. 이 함수를 호출한 예에서 보듯이, 함수를 호출할 때 매개변수=값의 형태로 매개변수에 할당할 값을 명시할 수 있다. 이렇게 하면 기본값이 있는 다른 매개변수의 값을 생략하고 매개변수의 위치도 바꾸어 호출할 수 있다.

매개변수의 기본값을 정의하는 기능과 값을 전달받을 매개변수를 특정하는 기능을 잘 활용하면 함수의 사용 편의성과 활용도를 높일 수 있다.

개념 정리

  • 인자를 전달받을 매개변수를 명시할 수 있다.

3.5.3 print() 함수로 행 바꾸지 않고 출력하기

print() 함수를 실행하면 매개변수에 전달한 인자가 화면에 출력된 후, 행이 바뀐다. print() 함수에는 데이터를 출력한 뒤에 덧붙여 출력할 내용을 전달받는 매개변수 end가 정의되어 있는데, 이 매개변수의 기본값이 행을 바꾸는 것(개행문자)이기 때문이다. 그런데 때로는 print() 함수 실행 후에 행이 바뀌지 않게 해야 할 때가 있다. 다음 예를 보자.

코드 3-20 print() 함수는 기본으로 행을 바꾼다

print('주문하실 음료를 알려주세요:')  # 행이 바뀐다
drink = input()

실행 결과:

주문하실 음료를 알려주세요:
카페라테

이 예에서 ‘주문하실 음료를 알려주세요:’ 뒤에 행이 바뀌지 않도록 하고 싶다면? print(..., end='') 와 같이 end 매개변수에 빈 텍스트('')를 대입하면 된다. (텍스트 데이터에 대해서는 4장에서 알아본다.)

이 방법을 이용하면 다음과 같이 한 행에서 안내 메시지 출력과 사용자 입력을 함께 처리할 수 있다.

코드 3-21 print() 함수에 종료 문자를 빈 문자로 지정하기

print('주문하실 음료를 알려주세요:', end='')  # 행이 바뀌지 않는다
drink = input()

실행 결과:

주문하실 음료를 알려주세요: 카페라테

다음과 같이 print() 함수의 end 매개변수를 원하는 다른 텍스트로 바꿔도 된다.

코드 3-22 print() 함수에 종료 문자를 빈 문자로 지정하기

print('카페라테', end=', ')
print('아메리카노', end=', ')
print('비엔나', end='...')

실행 결과:

카페라테, 아메리카노, 비엔나...

print()처럼, 기본값이 정해진 매개변수에 다른 인자를 전달함으로써 함수의 동작을 조정할 수 있는 함수가 많다. 이렇게 선택적으로 값을 지정할 수 있는 매개변수를 ‘옵션(option, 선택사항)’이라고도 부른다.

연습문제

연습문제 3-10 행 바꾸지 않고 출력하기

사용자로부터 두 개의 텍스트를 입력받아, 입력받은 내용을 출력하는 프로그램을 작성해 보아라. 예를 들어 사용자가 카페라테, 쿠키라고 입력한다면 실행 결과는 다음과 같아야 한다.

주문하실 음료: 카페라테
주문하실 간식: 쿠키
카페라테 쿠키 주문 받았습니다.

힌트: 이 문제는 함수를 호출하는 방법을 묻는 문제다. 함수를 정의하지 않아도 된다.