프로그래머가 아닌 이들을 위한 파이썬 3 자습서/고급 함수 예제

위키책, 위키책

어떤 사람들에게는 이 섹션이 매우 유용하지만, 어떤 사람들에게는 매우 혼란스러울 것이다. 만약 이것이 당신을 혼란스럽게 하면 건너뛰십시오. 이제 우리는 다음 프로그램을 검토할 것입니다:

def mult(a, b):
    if b == 0:
        return 0
    rest = mult(a, b - 1)
    value = a + rest
    return value
print("3 * 2 = ", mult(3, 2))

기본적으로 이 프로그램은 양의 정수를 곱하는 함수를 만들고 (내장된 곱셈 함수보다 많이 느리다) 이 함수를 사용하여 이 기능을 보여줍니다. 이 프로그램은 재귀(recursion)를 사용하는 바법을 보여줍니다, 재귀란 함수 속에서 반복(iteration; repetition)의 형태를 이용하여 종료조건이 충족되기 전까지 반복적으로 함수를 호출하는 것입니다. 이것은 곱셈과 같은 결과를 도출하기 위해 반복적으로 가산합니다: e.g. 3 + 3 (덧셈) 은 3 * 2 (곱셈)과 같은 결과를 가져옵니다.

질문: 이 프로그램이 처음 해야 하는 것은 무엇인가?
답변: 처음 해야 하는 것은 함수 mult 가 정의된 줄이다:
def mult(a, b):
    if b == 0:
        return 0
    rest = mult(a, b - 1)
    value = a + rest
    return value
이것은 두 개의 매개변수를 가지고 실행결과 한 개의 값을 반환하는 함수를 만든다. 만든 후에는 이 함수를 실행할 수 있다.
그 다음에 일어나는 것은 무엇인가?
함수의 다음 줄은, print("3 * 2 = ", mult(3, 2))이 실행된다.
그리고 이것은 무엇을 하는가?
3 * 2 = mult(3, 2)의 반환값을 출력한다.
그리고 mult(3, 2)가 반환하는 값은 무엇인가?
그것을 알기 위해서 우리는 mult 함수를 처음부터 검토할 필요가 있다.
그 다음에는 무슨 일이 일어나는가?
변수 a는 3을 값으로 할당받으며 변수 b는 2를 값으로 할당받는다.
그 다음은?
if b == 0: 줄이 실행된다. b가 2를 값으로 가지므로 이것은 거짓(false)이다 그래서 return 0 줄은 건너뛴다.
그리고 그 다음은?
rest = mult(a, b - 1) 줄이 실행된다. 이 줄은 지역 변수 restmult(a, b - 1)의 값을 갖도록 설정한다. a의 값은 3이고 b의 값은 2이므로 호출되는 함수는mult(3,1)이다.
그러면 mult(3, 1)의 값은 무엇인가?
우리는 매개변수 3과 1을 갖는 mult 함수를 실행할 필요가 있다.
그러면 그 다음에는 무슨 일이 일어나는가?
함수의 새로운 실행에서 지역 변수가 설정되었으므로 a는 3, b는 1을 값으로 한다. 이것들은 지역값으므로 ab의 이전값에 영향을 미치지 아니한다.
그러면?
b의 값은 1이므로 if 조건문은 거짓이어서, 다음 줄은 rest = mult(a, b - 1)이 된다.
이 줄은 무엇을 하는가?
이 줄은 rest의 값으로 mult(3, 0)을 할당한다.
그 값은 무엇인가?
그 값을 알기 위해서는 한 번 더 함수를 실행해야 한다. 이번에는 a는 3, b는 0을 값으로 한다.
그거면 그 다음은 뭔가?
함수의 첫 줄 if b == 0:을 실행해야 한다. b의 값이 0이므로 다음에 실행해야 하는 줄은 return 0 이다.
그리고 return 0은 무엇을 하는가?
이 줄은 함수에 값 0을 반환한다.
그래서?
그래서 이제 우리는 mult(3, 0) 의 값이 0임을 알게 된다. 이제 우리는 rest = mult(a, b - 1) 줄이 매개 변수 3과 0을 갖는 mult 함수가 출현할 때까지 실행되는 것을 알게 되었다. 우리는 mult(3, 0)을 실행하면서 그것을 종료하였으니 이제는 mult(3, 1)으로 돌아가야 한다. 변수 rest 는 0을 할당받는다.
다음에 실행되는 줄은 무엇인가?
value = a + rest 줄이 다음에 실행되다. 실행하는 함수 내부에서, a = 3 이고 rest = 0 이므로 현재의 value = 3이다.
그 다음 일어나는 것은 무엇인가?
return value 줄이 실행된다. 이것은 함수에서 3을 반환한다. 이것은 또한 mult(3, 1) 함수의 실행을 종료한다. return이 호출된 다음, 우리는 실행중인 mult(3, 2)으로 되돌아가야 한다.
우리가 있던 mult(3, 2)는 어디인가?
우리는 변수 a = 3b = 2를 갖고 rest = mult(a, b - 1) 줄을 검사하고 있었다.
그러면 이제 무엇을 해야 하는가?
변수 rest 은 3을 할당받았다. 다음 줄은 value = a + rest 인데 value3 + 3 이어서 6이다.
그러면 이제 무슨 일이 일어나는가?
다음 줄이 실행되면, 함수에서 6을 반환한다. 이제 우리는 실행중이던 print("3 * 2 = ", mult(3, 2)) 으로 돌아가서 이제는 6을 출력할 수 있게 된다.
전체적으로 무슨 일이 일어난 것인가?
기본적으로 우리는 두 수의 곱을 계산하기 위해 두 가지 사실을 사용했다. 첫 번째는 어떤 수에 0을 곱하면 0이라는 사실이다(x * 0 = 0). 두 번째는 한 수에 다른 수를 곱하는 것은 첫 번째 수와 첫 번째 수에 두 번째 수에서 하나 적은 수를 곱한 수를 더한 것과 같다는 사실이다(x * y = x + x * (y - 1)). 그래서 3 * 2 는 처음에 3 + 3 * 1로 변환된다. 그 다음 3 * 13 + 3 * 0으로 변환된다. 그리고 우리는 어떤 수에 0을 곱해도 0이 나온다는 사실을 알기 때문에 3 * 0은 0이다. 그러면 우리는 3 + 3 * 03 + 0임을 계산할 수 있으며 그 결과는 3이다. 이제 우리는 3 * 1 은 무엇인지 알기 때문에 3 + 3 * 13 + 3과 같다고 계산할 수 있으며 그 결과는 6이다.

아래는 전체적으로 어떻게 동작했는지 보여준다:

3 * 2
3 + 3 * 1
3 + 3 + 3 * 0
3 + 3 + 0
3 + 3
6

재귀[+/-]

Programming constructs solving a problem by solving a smaller version of the same problem are called recursive. 이번 장의 예제들에서, 재귀는 자기 자신을 호출하는 함수로 정의함으로써 실현된다. This facilitates implementing solutions to programming tasks as it may be sufficient to consider the next step of a problem instead of the whole problem at once. It is also useful as it allows to express some mathematical concepts with straightforward, easy to read code.

Any problem that can be solved with recursion could be re-implemented with loops. Using the latter usually results in better performance. However equivalent implementations using loops are usually harder to get done correctly.

Probably the most intuitive definition of recursion is:

Recursion
If you still don't get it, see recursion.

만약 곱셈예제를 이해하지 못했다면 계승(factorial) 예제를 처음부터 검토하라.

예제[+/-]

factorial.py

#계승(factorial)을 계산하는 함수를 정의합니다

def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)

print("2! =", factorial(2))
print("3! =", factorial(3))
print("4! =", factorial(4))
print("5! =", factorial(5))

출력:

2! = 2
3! = 6
4! = 24
5! = 120

countdown.py

def count_down(n):
    print(n)
    if n > 0:
        return count_down(n-1)

count_down(5)

출력:

5
4
3
2
1
0


틀:Navigation 스크립트 오류: "TScope" 모듈이 없습니다.