입출력 내역

IPython 셸에서는 위쪽 및 아래쪽 화살표 키나 Ctrl-p/Ctrl-n 단축키를 사용하여 이전 명령어에 접근합니다. 또한 IPython은 셸과 노트북 환경 모두에서 이전 명령어의 실행 결과나 명령어 문자열 자체를 가져오는 다양한 방법을 제공합니다. 이번 섹션에서는 그 방법들을 살펴보겠습니다.

IPython의 In 및 Out 객체

IPython을 사용하다 보면 In [1]:/Out[1]: 스타일의 프롬프트가 익숙해지셨을 것입니다. 그런데 이 프롬프트는 단순히 보기 좋으라고 만든 장식이 아닙니다. 여기에는 현재 세션의 이전 입출력에 접근하는 방법이 담겨 있습니다. 다음과 같이 세션을 시작했다고 가정해 봅시다.

``ipython In [1]: import math

In [2]: math.sin(2) Out[2]: 0.9092974268256817

In [3]: math.cos(2) Out[3]: -0.4161468365471424


내장 `math` 패키지를 불러와서 2의 사인과 코사인 값을 계산했습니다.
이 입출력 결과는 셸에 `In`/`Out` 레이블과 함께 표시되는데, 사실 IPython은 이 내역을 반영하기 위해 자동으로 업데이트되는 `In`과 `Out`이라는 파이썬 변수를 생성합니다.

``ipython
In [4]: In
Out[4]: ['', 'import math', 'math.sin(2)', 'math.cos(2)', 'In']

In [5]: Out
Out[5]:
{2: 0.9092974268256817,
 3: -0.4161468365471424,
 4: ['', 'import math', 'math.sin(2)', 'math.cos(2)', 'In', 'Out']}

In 객체는 실행된 명령어들을 순서대로 추적하는 리스트입니다. 리스트의 첫 번째 항목은 In [1]이 첫 번째 명령어를 가리킬 수 있도록 비워둔 자리표시자입니다.

``ipython In [6]: print(In[1]) import math


`Out` 객체는 리스트가 아니라 입력 번호를 실행 결과에 매핑하는 딕셔너리입니다.

``ipython
In [7]: print(Out[2])
0.9092974268256817

모든 작업이 실행 결과를 반환하는 것은 아닙니다. 예를 들어 import 문이나 print 문은 출력 결과에 영향을 주지 않습니다. print 문이 결과로 남지 않는다는 사실이 조금 의외일 수 있지만, printNone을 반환하는 함수라는 점을 생각하면 자연스럽습니다. IPython은 간결함을 유지하기 위해 None을 반환하는 명령어는 Out에 추가하지 않습니다.

이 기능은 이전 결과를 다시 활용하고 싶을 때 유용합니다. 예를 들어 앞서 계산한 결과들을 사용하여 sin(2) ** 2cos(2) ** 2의 합을 확인해 보겠습니다.

``ipython In [8]: Out[2] ** 2 + Out[3] ** 2 Out[8]: 1.0


결과는 삼각함수의 항등식대로 `1.0`이 나옵니다.
여기서는 굳이 이전 결과를 끌어다 쓸 필요가 없었지만, 계산 시간이 매우 오래 걸리는 복잡한 작업을 실행하고 결과를 변수에 담는 것을 깜빡했을 때는 이 방법이 무척 유용합니다.

## 밑줄 단축키와 이전 실행 결과

표준 파이썬 셸에는 마지막 실행 결과에 접근하는 간단한 단축키가 하나 있습니다. 바로 마지막 실행 결과로 계속 업데이트되는 `_`(밑줄 하나) 변수입니다. 이는 IPython에서도 똑같이 작동합니다.

``ipython
In [9]: print(_)
1.0

IPython은 여기서 한 걸음 더 나아갑니다. 밑줄 두 개(__)를 쓰면 마지막에서 두 번째 결과에, 밑줄 세 개(___)를 쓰면 마지막에서 세 번째 결과에 접근합니다(출력이 없는 명령어는 건너뜁니다).

``ipython In [10]: print(__) -0.4161468365471424

In [11]: print(___) 0.9092974268256817


밑줄 사용은 세 개까지만 지원됩니다. 네 개 이상부터는 개수를 세기도 힘들고 헷갈리기 때문에, 그 시점부터는 행 번호로 결과를 참조하는 편이 훨씬 쉽습니다.

언급할 만한 단축키가 하나 더 있습니다. `Out[X]`를 짧게 표현하면 `_X`(밑줄 뒤에 행 번호)가 됩니다.

``ipython
In [12]: Out[2]
Out[12]: 0.9092974268256817

In [13]: _2
Out[13]: 0.9092974268256817

실행 결과 숨기기

가끔은 명령어의 실행 결과를 화면에 표시하고 싶지 않을 때가 있습니다(나중에 시각화 섹션에서 다룰 그래프 그리기 명령어 등에서 자주 발생합니다). 혹은 실행 결과가 너무 커서 기록에 남기고 싶지 않을 때도 있을 것입니다. 이럴 때는 줄 끝에 세미콜론(;)을 붙여주면 결과가 표시되지 않습니다.

``ipython In [14]: math.sin(2) + math.cos(2);


결과는 정상적으로 계산되지만, 화면에 표시되거나 `Out` 딕셔너리에 저장되지는 않습니다.

``ipython
In [15]: 14 in Out
Out[15]: False

관련 매직 명령어

이전 입력 내역을 한꺼번에 확인하고 싶을 때는 %history 매직 명령어가 유용합니다. 다음은 처음 세 개의 입력 내역을 출력하는 예시입니다.

``ipython In [16]: %history -n 1-3 1: import math 2: math.sin(2) 3: math.cos(2) ````

항상 그렇듯 %history?를 입력하면 자세한 옵션과 설명을 확인합니다(? 기능에 대한 자세한 내용은 IPython 도움말과 문서 섹션을 참조하세요). 그 밖에도 명령어 기록의 일부를 다시 실행하는 %rerun, 기록의 일부를 파일로 저장하는 %save 등의 유용한 매직 명령어가 있습니다.