파이썬 피보나치 예제 a, b = b, a+b 설명

2018. 6. 10. 23:10Hobby/Programming

반응형

파이썬 공식 문서에 아주 당황스러운 피보나치 수열 예제가 있습니다. 대화형 창에서 더하기, 빼기 하며 파이썬 개요를 설명하는 극초반 부분에 나옵니다. 파이썬에 대해 아무것도 모른 상태에서 이 코드를 보면 해석하기 아주 어렵습니다.

예제 코드는 아래와 같습니다. 

>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while b < 10:
...     print(b)
...     a, b = b, a+b
...

실행 결과는 1, 1, 2, 3, 5, 8이 세로로 출력 됩니다.

사람들을 헤깔리게 하는 문제의 코드는

...     a, b = b, a+b

암호문 같은 난해한 쉽표와 등호가 있는 수식입니다. 구글에 검색하니 질문 답글이 아주 많이 올라왔지만 속시원한 설명도 없습니다. 질문이 많은건 어찌 보면 당연합니다. 이 예제는 파이썬 설치하고 사용법 설명해주는 곳에 나옵니다.

자료구조에 있는 튜플을 아직 배우지 않았으면 해석하지 못하는 것이 당연합니다. 더군다나 이 수식에는 착시 현상까지 있습니다.


보충설명 하자면 대부분의 사람은

... a, b = 0, 1 # 이 수식을

... (a, b) = (0, 1) # 이렇게 괄호가 있는 것으로

읽을 것 입니다. 눈에 쏙 들어오고 당연하게 이렇게 사용하리라 생각 됩니다. 이것이 파이선에서 튜플이라고 하는 자료구조 형태입니다.

그러나 아래 코드는 좀 복잡해 보이죠. 대부분의 사람은

... a, b = b, a+b # 이 수식을

... a, (b = b), (a+b) # 이렇게 괄호가 있는 것으로

읽을 것 입니다. 파이썬의 튜플을 모르는 상태에서 발생하는 착시 현상입니다.

정확한 괄호 표기는

...     (a, b) = (b, a+b)

이렇게 됩니다.

코드의 실행 순서는 오른쪽 부터 입니다. a+b가 먼저 실행되어 그 값이 b에 저장됩니다. 바뀐 b의 값이 a에 저장됩니다. 이 과정을 언팩킹이라고 합니다. 패킹과 언패킹은 튜플 문서를 보면 자세하게 설명되어 있습니다.


그냥 지나가기 서운해서 숫자를 입력받아 해당 숫자 만큼 피보나치 수열 계산하고 출력하는 예제를 만들었습니다.

pythonex.txt 파일로도 첨부합니다.

  1. # -*- coding: utf-8 -*-
  2. a, b = 0, 1
  3. i = int(input('number : '))
  4. while b < i:
  5.     print(b, end='\n')
  6.     a, b = b, a+b


반응형