함수 인자 ==================== 리보그 세상에 한가지 유형 이상의 객체가 있을 때, 리보그가 어떤 객체를 집거나 놓을지 함수 인자를 사용해서 다음과 같이 명세해야만 된다:: take("token") put("star") 하지만, 아직 그런 함수를 어떻게 정의하는지는 살펴보지 않았다. 실제 해보면 매우 쉽다: 해야 되는 작업은 함수를 정의할 때 괄호 사이에 인자로 변수를 포함하기만 하면 된다. 예를 들어, 숫자를 인자로 받는 ``turn()`` 함수를 정의한다. 여기서 숫자는 리보그가 회전하고자 하는 좌회전 횟수를 나타낸다. 따라서, ``turn(1)`` 은 왼쪽으로 1회 회전하는 반면에, ``turn(3)`` 은 왼쪽으로 3회 회전(알시다시피, 좌3회전은 우1회전하는 필요한 횟수)한다. 이를 구현하는 한 방법은 다음과 같다:: def turn(number): for _ in range(number): turn_left() .. topic:: 여러분 차례! ``turn`` 함수 같은 것을 구현해보고, 프로그램에서 시도해 본다. 다수 인자 ------------------- 상기한다면, ``print()`` 함수는 콤마로 구분된 인자 각각을 하나 이상 받을 수 있다. 아마도, 유사한 함수를 정의하는 방법도 추측할 수 있을 것이다:: def my_function(argument_1, argument_2, ...): # 코드 덩어리 위에 나온 것처럼, 회전 횟자... 이동 횟수... *아무 것이나* 수행 횟수를 명세한다고 가정하자. ``turn`` 같은 함수를 반복된 동작 유형에 정의할 수 있다; 하지만, 단일 함수만 정의하는 좀더 일반적인 방법이 있는데, 이를 my_repeat 으로 부른다 (더 나은 명칭은 **repeat** 이지만, 리보그 특수 키워드가 있어 달리 이름지었다). 다음에 가능한 정의가 나와 있다:: def my_repeat(function, number): for _ in range(number): function() 그래서, 만약 함수 ``turn_left`` 와 ``3`` 을 인자로서 호출하면:: my_repeat(turn_left, 3) 다음과 같이 해석된다:: for _ in range(3): # number 가 3으로 대체 turn_left() # function 는 turn_left 로 대체 친숙한 ``turn_right`` 함수와 동치임을 인지하게 된다. 하지만, ``my_repeat`` 함수를 정의했기 때문에, 횟수와 함수를 다르게 해서 사용할 수 있다. 예를 들어:: my_repeat(move, 4) # move 4번 .. topic:: 여러분 차례! ``my_repeat`` 함수 같은 것을 구현해보고, 프로그램에서 시도해 본다. .. important:: 임의 인자 갯수를 받을 수 있는 ``print()`` 함수와 달리, 지금까지 정의한 함수는 항상 정해진 인자 갯수가 필요하다(``turn`` 은 1개, ``my_repeat`` 는 2개). 함수를 정의할 때 지정된 것과 다른 인자 갯수를 전달하면 어떤 일이 발생할지 점검한다. 몇가지 다른 개념을 접한 후에, 임의 인자 갯수를 받는 함수를 생성하는 것은 추후 살펴볼 것이다.