파이썬 언어 기본, IPython 및 Jupyter 노트북

파이썬 인터프리터

파이썬은 한번에 한 문장씩 실행하는 인터프리터 언어이다. 파이썬 인터프리터는 다음과 같이 실행한다.

c:\Users\dyoon>python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 5
>>> print(a)
5
>>>

여기서 >>>를 프롬프트라고 부르고 이곳에서 식을 입력하고 실행시킨다. 인터프리터를 종료하려면 Ctrl + Z 또는 exit()를 입력하고 엔터를 친다. .py 파일을 실행하기 위해서는 명령창에서 python 뒤에 .py 파일을 입력하고 엔터를 치면 된다. 예를 들어 hello_world.py 파일 안에 다음과 같은 내용이 입력되어 있다고 하자.

print('안녕하세요!')

그리고 그 파일이 파이썬 인터프리터 실행 디렉토리에 위치해 있다고 가정하자. 즉, 현재 파이썬 인터프리터를 실행하고 있는 디렉토리가 C:\Users\dyoon이라면 hello_world.py로 같은 디렉토리에 놓여 있어야 한다. 이 파일을 실행하려면 다음과 같이 한다.

c:\Users\dyoon>python hello_world.py
안녕하세요!

IPython 기초

IPython Shell 실행

명령창에서 다음과 같이 ipython을 입력한다.

C:\work>ipython
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Jupyter 노트북

노트북 실행

명령창에서 jupyter notebook을 입력하여 실행한다.

C:\work>jupter notebook
[I 14:28:27.935 NotebookApp] The port 8888 is already in use, trying another port.
[I 14:28:27.989 NotebookApp] [jupyter_nbextensions_configurator] enabled 0.4.0
[I 14:28:28.116 NotebookApp] Serving notebooks from local directory: C:/Users/dyoon/daeki/ativ/Lecture/IndustrialMath/Lecture
[I 14:28:28.116 NotebookApp] 0 active kernels
[I 14:28:28.119 NotebookApp] The Jupyter Notebook is running at:
[I 14:28:28.124 NotebookApp] http://localhost:8889/?token=7ed068864578dc3999dd918530ee05057fe931a220242923
[I 14:28:28.124 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 14:28:28.131 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8889/?token=7ed068864578dc3999dd918530ee05057fe931a220242923
[I 14:28:28.321 NotebookApp] Accepting one-time-token-authenticated connection from ::1

자동으로 기본 웹브라우저가 실행이 되면서 다음과 같은 화면이 나올 것이다. 물론 표시되는 내용은 사용자마다 다르게 보일 수 있다.

새 노트북 만들기

새 노트북을 만들기 위해서 오른쪽 위의 New를 누르고 Python 3를 누른다.

명령어 실행

다음과 같이 입력을 한 후 Shift + Enter를 눌러 셀을 실행한다.

쥬피터 노트북은 셀 단위로 실행을 한다.

노트북 저장

노트북을 저장하려면 Ctrl + s를 누르든지 File - Save and Checkpoint를 누르면 된다. 노트북 이름은 기본이 Untitled.ipynb이다. 이름을 변경하려면 File - Rename을 눌러서 파일이름을 변경할 수 있다. 쥬피터 노트북이 실행되는 위치는 기본으로 사용자 디렉토리이다. 따라서 저장된 파일도 실행된 디렉토리에 위치하게된다.

노트북 실행 위치 변경

노트북 실행 위치를 특정 디렉토리에서 실행하고 싶으면 먼저 그 디렉토리로 이동을 한 후 jupyter notebook .을 입력한다. 마지막에 나오는 점은 현재 디렉토리에서 실행하라는 뜻이다. 예를 들어 c:\work 디렉토리에서 노트북을 실행시키려면 다음과 같이 cd c:\work를 해서 c:\work 디렉토리로 이동한 후 거기서 jupyter notebook .을 실행한다.

c:\Users\dyoon>cd c:\work
c:\work>jupyter notebook .

아이콘을 이용해서 변경하고 싶으면 시작 - Anaconda 3를 클릭한 후 Jupyter Notebook오른쪽 클릭하면 자세히 - 작업 표시줄 고정를 클릭하면 맨 아래 작업 표시줄에 아이콘이 생긴다. 그 아이콘을 오른쪽 클릭 한 후 Jupyter Notebook 을 다시 오른쪽 클릭하여 속성을 클릭한다. 대상 항목에 %USERPROFILE% 부분을 원하는 폴더 경로(절대경로)로 설정하고 확인을 누른다. 쥬피터 노트북 아이콘을 누르면 명령창과 웹브라우저가 나타난다. 종료할 때는 웹브라우저 뿐만 아니라 명령창도 반드시 함께 종료해 주어야 한다.

셀 형식

  • 코드(Code)
  • 마크다운(Markdown)
  • Raw NbConvert: Latex, ReStructuredText

탭 완성(Tab Completion)

IPython shell이 표준 파이썬 쉘과 비교해서 향상된 것은 탭을 눌러서 기존 변수, 함수, 객체들을 완성할 수 있는 것이다. 아래와 같이 str<Tab>을 누르면 str로 시작하는 변수와 객체들을 보여준다. str_data는 방금 만든 것이고 str은 문자열 객체로 파이썬 내장 객체이다.

다음 예제는 b는 리스트 객체이고 b.<Tab>을 누르면 리스트 객체의 메소드들이 출력된다.

이 밖에도 다양한 상황에서 탭 완성을 사용할 수 있다. 문자열로 시작하는 파일이름 또는 디렉토리 이름을 찾는데도 사용할 수 있다. 주피터 노트북에서도 마찬가지로 사용할 수 있다. 함수의 키워드 매개 변수의 이름을 탭 완성을 통해 볼 수 있다.

도움말

변수 앞 또는 뒤에 물음표를 붙여서 변수 객체의 정보를 볼 수 있다.

함수의 사용법에 대해서도 알아 볼 수 있다.

물음표 두 개 ??를 이용해서 코드에 대해서도 알아볼 수 있다.

와일드 카드(*)를 이용해서 특정한 문자열이 들어간 객체들을 찾을 수 있다.

%run 명령

IPython shell에서 .py 파일을 %run 명령어를 이용해서 실행할 수 있다. 예를 들어 간단한예제.py 파일 안에 다음과 같은 내용을 입력하자.

def 간단함수(a, b, c):
    return a + b  + c

a = 2
b = 3
c = 4

결과 = 간단함수(a, b, c)
print('결과 = ', 결과)

그리고 다음과 같이 실행한다.

%load 매직 명령어를 이용하여 스크립트 파일을 편집할 수 있다.

실행되는 프로그램을 종료하기 위해서는 Ctrl + C를 누르면 된다.

클립보드 코드 실행

주피터 노트북을 사용하면 언제든지 복사/붙여넣기를 해서 코드를 실행할 수 있다. IPython에서도 마찬가지로 복사/붙여넣기를 할 수 있는 매직 명령어가 있다. %paste%cpaste를 이용하면 다른 곳에 있는 코드를 복사를 해서 실행할 수 있다. 다음과 같은 코드를 IPython에서 실행하기 위해서 Ctrl + c를 이용해서 클립보드에 복사를 했다고 하자.

x = 5
y = 7
if x > 5:
    x += 1
    y = 8
else:
    x -= 1
    y = 6
print('x={}, y={}'.format(x, y))

IPython shell에서 %paste를 입력하고 엔터를 치면 코드 내용이 실행이 된다.

결과도 ## -- End pasted text -- 아래에 표시되는 것을 볼 수 있다. 또한 %cpaste를 이용할 수도 있다. %cpaste를 입력하고 엔터를 치고 ctrl + v를 눌러 붙여넣기를 한다. 이 상태에서는 %paste와 다르게 코드를 수정할 수도 있다. Ctrl + z 또는 --를 마지막 줄에 입력하고 엔터를 치면 코드를 실행할 수 있다.

또는

실행을 원치 않으면 Ctrl + c를 눌러 멈출 수 있다.

터미널 단축키

IPython shell 사용시 편리한 단축키들을 제공한다.

단축키 설명
Ctrl-P 또는 위쪽 화살표 현재 입력된 문자열로 시작하는 이전에 입력된 명령어들 앞으로 검색
Ctrl-N 또는 아래쪽 화살표 현재 입력된 문자열로 시작하는 이전에 입력된 명령어들 뒤로 검색
Ctrl-R 이전에 입력했던 문자열 검색
Ctrl-V 클립보드 내용 복사
Ctrl-C 현재 실행되고 있는 코드 중지
Ctrl-A 커서를 맨 앞으로 이동
Ctrl-E 커서를 맨 뒤로 이동
Ctrl-K 커서 뒤 문자 삭제
Ctrl-U 현재 줄 지울
Ctrl-F 커서를 한 문자 앞으로 이동
Ctrl-B 커서를 한 문자 뒤로 이동
Ctrl-L 화면 정리

주피터 노트북도 많은 단축키를 제공한다. Help 메뉴에 Keyboard Shortcuts를 참조하라.

매직 명령어(Magic Commands)

IPython은 표준 파이썬 터미널에 없는 특별한 매직 명령어들을 제공한다. 매직 명령어는 IPython에서 자주 사용되는 기능들을 편리하게 사용할 수 있도록 한다. 매직 명령어는 %로 시작한다. 예를 들어 %timeit을 이용하면 코드의 실행 시간을 측정할 수 있다.

In [2]:
import numpy as np

a = np.random.randn(100, 100)

%timeit np.dot(a, a)
56.4 µs ± 10.9 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

앞에서 .py 파일을 실행할 때 사용했던 %run도 매직 명령어이다. 매직 명령어는 같은 이름의 변수를 사용하지 않으면 %를 붙이지 않고도 사용할 수 있다. 이 기능을 automagic이라고 부르고 %automagic 명령어를 이용해 활성화 또는 비활성화 할 수 있다. 전체 매직 명령어들에 대해 알아보려면 %quickref 또는 %magic 명령어를 사용한다.

명령어 설명
%quickref 매직 명령어들에 대한 설명
%magic 사용 가능한 모든 매직 명령어들에 대한 자세한 설명
%debug 대화형 디버거로 진입
%hist 이전에 입력했던 명령어 출력
%pdb 예외 발생시 자동으로 디버거 실행
%paste 클립보드 파이썬 코드 실행
%cpaste 붙여넣기 한 코드를 수정할 수 있는 특별한 프롬프트 열기
%reset 모든 변수와 이름 삭제
%page 객체 객체를 보기 좋게 출력
%run script.py IPython shell에서 script.py 실행
%prun 문장 문장 실행후 프로파일러 출력
%time 문장 한 문장에 대한 실행 시간 출력
%timeit 문장 문장을 여러번 실행해서 평균 실행 시간 출력
%who, %who_ls, %whos 정의된 변수 출력
%xdel 변수 변수를 참조하고 있는 모든 객체 삭제 시도

matplotlib 통합

IPython과 Jupyter의 장점 중 하나가 matplotlib와 같은 시각화 라이브러리들과 통합이 잘 된다는 것이다. %matplotlib 매직 명령어를 사용하여 IPython shell에서 그래프를 그릴 수 있다.

주피터에서는 %matplotlib inline이라고 입력한다.

In [9]:
%matplotlib inline

import matplotlib.pyplot as plt

plt.plot(np.random.randn(50).cumsum())
Out[9]:
[<matplotlib.lines.Line2D at 0x1dbdc0d36a0>]
_images/PythonIPythonJupyterBasics_5_1.png

파이썬 언어 기초

파이썬 문법

들여쓰기

실행 구역을 구분하기 위해 들여쓰기를 한다. C, Java, C++에서 구역 구분을 위해서 중괄호 {}를 사용한다. 들여쓰기는 같은 양의 공백(space) 또는 탭으로 같은 구역을 구분한다. 따라서 아무때나 들여쓰기를 하면 오류가 발생한다. 다음에서 보는바와 같이 잘못된 들여쓰기를 하면 IndentationError 오류를 발생시킨다.

In [1]:
"들여쓰기 실험"
    "들여쓰기 해도 될까?" # 이 부분에서 오류
  File "<ipython-input-1-6caab62bb03e>", line 2
    "들여쓰기 해도 될까?"
    ^
IndentationError: unexpected indent

들여쓰기는 for, while, if 또는 함수를 정의할 때 사용이 된다.

for i in range(10):
    x = i + 1
    print(x) # 들여쓰기로 for 문 구역을 구분

들여쓰기 양은 보통 4칸의 스페이스를 사용한다. 편집기는 보통 탭을 스페이스로 자동으로 변환하는 기능들이 있다. 파이참도 한 개의 탭을 4개의 스페이스로 자동 변환한다.

모든 것이 객체

파이썬에서 사용되는 모든 수, 문자열, 자료 구조, 함수, 클래스, 모듈은 모두 객체이다. 객체는 타입(type)과 자료(data)로 이루어진다. 모든 것을 객체로 간주함으로 유연하고 일관성있는 프로그래밍을 가능하게 한다.

주석(comment)

해시 기호 # 뒤에 나오는 모든 문자는 파이썬 인터프리터가 무시를 한다. 즉, 프로그래밍에 아무런 영향을 주지 않는다. 이것은 보통 주석을 달기 위해 사용된다. 또는 코드를 실행시키지 않으려고 할 때 사용하기도 한다.

for i in range(10):
    # x = x - i
    # print(x)
    print(i)

다음과 같이 코드의 줄 끝에 사용하여 코드를 설명하는데 사용되기도 한다.

x = 100
print("결과 : {}".format(x)) # x의 결과 출력

함수 및 메소드 호출

함수를 호출할 때는 함수 이름 뒤에 소괄호 ()를 붙이고 소괄호 안에는 인자를 선택적으로 넘겨줄 수 있다. print()도 함수이고 함수 이름은 print이고 소괄호 안에 인자를 넘겨 주어 출력을 하도록 하는 것이다. 다음은 "안녕하세요"print 함수의 인자가 되는 것이다.

print("안녕하세요")

대부분의 파이썬 객체는 함수를 가지고 있다. 이러한 함수를 메소드라고 부른다. 메소드는 객체 안의 내용들을 접근할 수 있다. 함수의 인자는 위치인자와 키워드 인자로 나눌 수 있다. 모든 키워드 인자는 반드시 위치 인자 뒤에 위치해야 한다. 함수가 반환하는 결과값을 변수에 할당할 수도 있다.

결과 = 함수()

변수 및 인자 넘기기

파이썬에서 변수에 값(객체)을 할당한다는 것은 그 변수가 객체를 참조하는 것이다. 다음과 같이 리스트 객체 [1, 2, 3]a 라는 변수에 할당해보자.

a = [1, 2, 3]

여기서 변수 a는 객체 자체가 아니라 객체를 가리키고 있는(참조) 이름이고 실제 객체는 리스트 [1, 2, 3]이다. 그리고 기존의 변수를 다른 변수에 할당할 수도 있다.

b = a

변수 ba가 가리키고 있는 객체 [1, 2, 3]을 동시에 가리키는 또다른 변수가 된다. 따라서 a를 통해서 객체를 변경하면 b도 변경된 동일 객체를 가리키게 된다. 즉, 다음과 같이 리스트 [1, 2, 3]에 원소를 하나 추가하면 b도 같은 값을 같는 것을 확인할 수 있다.

In [4]:
a = [1, 2, 3]
b = a
print('변경되기 전의 b = ', b)
a.append(4)
print('변경된 후의 b = ', b)
변경되기 전의 b =  [1, 2, 3]
변경된 후의 b =  [1, 2, 3, 4]

함수의 인자로 객체를 넘겨줄 때 함수 안에서는 넘겨진 객체를 다룰 새로운 변수를 만들어 객체를 참조한다. 즉, 똑같은 객체를 복사를 해서 넘기는 것이 아니다. 그러므로 가변 객체의 내용을 함수를 이용해서 변경할 수 있다. 다음은 함수 f를 통해서 리스트 x의 내용을 변경하는 예이다.

In [6]:
def f(a):
    a.append('통일')

x = ['한반도']
f(x)
print(x)
['한반도', '통일']

C++, Java와는 다르게 파이썬 변수는 타입이 없다. 변수는 객체를 가리키고 있는 이름일뿐이고 객체가 타입을 가지고 있다. 변수가 가리키고 있는 객체의 타입을 알기 위해서는 isinstance 함수를 사용한다.

In [7]:
a = 1
isinstance(a, int)
Out[7]:
True

다음과 같이 튜플을 사용해서 여러 개중의 하나라도 만족하면 참을 반환한다.

In [8]:
b = 2.5
isinstance(b, (int, float))
Out[8]:
True

속성 및 메소드

파이썬 객체는 일반적으로 속성(attribute)와 메소드(method)로 구성된다. 속성은 객체가 포함하고 있는 또 다른 객체이고 메소드는 객체의 속성들을 접근해서 변경할 수 있는 함수이다. 메소드도 속성에 포함시키기도 한다. 객체의 속성과 메소드에 접근하기 위해서는 객체.속성이름 또는 객체.메소드이름()을 이용한다. 다음은 문자열(str) 객체 a의 속성들을 a.<탭>을 이용하여 보여준 것이다.

또는 getattr(객체, 속성이름) 함수를 이용해서도 속성에 접근할 수 있다.

In [11]:
a = '문자열 속성 접근'
b = getattr(a, 'split') # a.split과 같다.
print(b)
b() # a.split()과 같다.
<built-in method split of str object at 0x000001F5D01D8378>
Out[11]:
['문자열', '속성', '접근']

Duck typing

오리처럼 걷고 오리처럼 꽥꽥우는 것은 오리이다라는 식으로 생각하는 것을 duck typing이라고 부른다. 어떤 객체든지 특정한 조건만 만족한다면 특정한 조건에 해당하는 객체라고 부른다. 예를 들면, 반복 가능한 객체(iterable object)란 __iter__() 메소드를 구현한 객체이면 모두 반복 가능 객체라고 한다. __iter__() 메소드는 반복자(iterator) 객체를 반드시 반환해야 한다. 반복자는 __next__() 메소드를 구현한 객체들이면 된다.

모듈 불러오기(import)

파이썬 모듈이란 .py 파일을 의미한다. 다음과 같은 모듈1.py가 있다고 하자.

# 모듈1.py
파이 = 3.14159

def 함수1(x):
    return x + 2

def 함수2(a, b):
    return a + b

다른 스크립트 파일 또는 모듈에서 모듈1에 있는 속성과 메소드들을 접근하기 위해서는 import 문을 사용한다.

import 모듈1

결과 = 모듈1.함수1(10)
print(결과)

print(모듈1.파이)

다음과 같이 as를 이용해서 모듈이름을 변경해서 사용할 수도 있다.

import 모듈1 as 모

결과 = 모.함수2(10, 20)
print(결과)
print(모.파이)

이항 연산 및 비교

수학 연산은 다음표와 같다.

연산 설명
a + b a 더하기 b
a - b a 빼기 b
a * b a 곱하기 b
a / b a 나누기 b
a // b a 를 b로 나눈 몫
a ** b a의 b 제곱(\(a^b\))
a & b a 와 b 둘 다 참일때만 참
a | b a 또는 b 중 하나만 참이어도 참
a ^ b a 또는 b 중 둘 중의 하나만 참일 때 참
a == b a와 b가 같을 때 참
a != b a 와 b가 다를 때 참
a <= b; a < b a가 b보다 작거나 같으면 참; a가 b보다 작으면 참
a >= b; a > b a가 b보다 크거나 같으면 참; a가 b보다 크면 참
a is b a와 b가 같은 객체를 가리키면 참
a is not b a와 b가 다른 객체를 가리키면 참

is는 두 객체가 같은 객체인지를 판단하고 ==는 두 객체의 값이 같은지를 판단한다. 정확하게는 a == b__eq__ 메소드가 구현되어 있다면 a.__eq__(b)를 실행하고 그렇지 않으면 is 함수를 실행한다.

In [14]:
a = [1, 2]
b = a
c = [1, 2]
print("a is b : {}, a == b : {}".format(a is b, a == b))
print("a is c : {}, a == c : {}".format(a is c, a == c))
a is b : True, a == b : True
a is c : False, a == c : True

가변(mutable)/불변(immutable) 객체

대부분의 파이썬 객체들, 즉 리스트, 사전, Numpy 배열, 사용자 클래스 등은 가변 객체이다. 가변 객체란 객체의 내용들을 변경할 수 있는 객체를 의미한다.

In [15]:
a = [1, 2, 'b']
a[2] = 'c'
a
Out[15]:
[1, 2, 'c']

하지만 튜플과 문자열은 불변 객체이다. 불변 객체의 내용을 변경하려고하면 오류가 발생된다.

In [17]:
 = "문자열"
print([0])
[0] = '글'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-5a3c4d28c4e9> in <module>()
      1= "문자열"
      2 print([0])
----> 3 [0] = '글'

TypeError: 'str' object does not support item assignment

함수의 인자로 가변 객체를 넘길 때 함수 안에서 가변 객체의 내용이 변하게 하는 동작을 부작용(side effect) 이라고 부른다. 부작용이 발생하는 함수일 경우는 반드시 다른 사용자가 알 수 있도록 문서로 명시를 해주어야 한다.

기본 데이터 형

숫자형

파이썬 기본 숫자형은 정수형(int)과 부동소수점형(float)가 있다. 정수형은 임의의 자리수까지 저장 가능하다.

In [19]:
정수 = 123456789
정수 ** 6
Out[19]:
3540705968149597751242378595390670323015412790761

부동소수점형은 64비트를 사용한다. 또한 과학용 표현식을 사용할 수 있다.

In [20]:
부동1 = 98.372
부동2 = 83.3e-8

정수 / 정수는 부동소수점형 결과가 나오고 정수 // 정수는 몫을 반환한다.

In [21]:
print(3 / 2)
print(3 // 2)
1.5
1

문자열(string)

리터럴 문자열(literal string)은 홑따옴표('), 곁따옴표(")를 쌍으로 사용할 수 있다.

문 = "문자열은 곁따옴표를 쌍으로 사용할 수 있다"
자 = '뿐만아니라 홑따옴표를 쌍으로 사용해도 된다'

여러 줄에 걸쳐서 긴 문자열을 사용하려면 홑따옴표 또는 곁따옴표 3개를 연속으로 쌍으로 사용하면된다.

In [22]:
 = '''
긴 문자열은
따옴표 3개를 연속으로
붙여서 쌍으로 사용할 수 있다.
'''

문자열은 상당히 많은 메소드들을 가지고 있다. count 메소드를 이용하면 새로운 줄의 갯수를 알 수 있다.

In [23]:
.count('\n')
Out[23]:
4

파이썬 문자열은 불변이기 때문에 한 번 만들어진 문자열의 내용을 변경할 수 없다.

In [24]:
[10] = '음'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-1d2baf2a8715> in <module>()
----> 1 [10] = '음'

TypeError: 'str' object does not support item assignment

문자열의 특정 부분 문자열을 다음과 같이 변경할 수 있다.

In [27]:
 = .replace('긴', '기다란')
print()

기다란 문자열은
따옴표 3개를 연속으로
붙여서 쌍으로 사용할 수 있다.

기다란으로 바꿨지만 원래 문자열이 바뀐 것이 아니고 새로운 문자열을 만든 것이다.

In [28]:
print()

긴 문자열은
따옴표 3개를 연속으로
붙여서 쌍으로 사용할 수 있다.

문자열은 str() 함수를 이용해서 다른 객체를 문자열 객체로 변환할 수 있다.

In [31]:
a = 3.9
b = str(a)
type(b)
Out[31]:
str

문자열은 열거형(sequence)의 일종이라서 열거형 메소드들을 사용할 수 있다. 대표적인 것이 슬라이싱이다.

In [33]:
 = "해뜨는 동해에서 ..."
list()
Out[33]:
['해', '뜨', '는', ' ', '동', '해', '에', '서', ' ', '.', '.', '.']
In [34]:
[:5] # 슬라이싱
Out[34]:
'해뜨는 동'

문자열 안에서 역슬래시(\)는 탈출문자로 사용되기 때문에 역슬래시 그 자체를 출력하기 원할 때는 역슬래시를 두번 적어줘야 한다.

In [37]:
print("문자열 안의 역슬래시 \\\n탈출\t문자이다.")
문자열 안의 역슬래시 \는
탈출      문자이다.

형식화된 문자열(formatted string)을 이용하면 문자열의 내용을 형식에 맞게 바꿀 수 있다. 간단한 예를 통해 알아보자.

In [42]:
 = "{0}{1:.2f}이다."
print(.format('파이', 3.1415))
파이는 3.14이다.
  • {0}에는 format()의 첫번째 인자가 넘겨진다.
  • {1:.2f}에서 1format 메소드의 2번째 인자이고 콜론 뒤의 것은 인자의 형식을 의미한다. .2f는 부동소수점형으로 소수 2자리까지 나타내라는 뜻이다.

바이트와 유니코드

논리형(boolean)

파이썬 논리형은 참을 나타내는 True와 거짓을 나타내는 False 두 가지가 있다. 논리형은 andor를 이용해서 결합할 수 있다.

In [43]:
True and False
Out[43]:
False
In [45]:
x = 100
1 < 0 or x > 0
Out[45]:
True

형 변환(type casting)

문자열, 정수형, 부동소수점형, 논리형들은 각각 str(), int(), float(), bool() 함수를 이용해서 자신의 객체로 변환할 수 있다.

In [46]:
a = "3.1415" # 문자열
b = float(a) # 부동소수점형
type(b)
Out[46]:
float

bool() 함수는 문자열인 경우 빈문자열을 제외한 모든 문자열은 참으로 변환하고 숫자형은 0을 제외한 모든 것을 참으로 변환한다.

In [47]:
bool(a)
Out[47]:
True

None 형

파이썬에서는 아무것도 없는 상태를 None형으로 설정한다. 함수의 경우 반환하는 값이 없을 때는 None을 기본으로 반환한다. NoneNoneType형의 유일한 인스턴스이다.

날짜와 시간

파이썬 내장모듈 datetimedatetime, date, time 객체를 제공한다.

In [70]:
from datetime import datetime

dt = datetime(2017, 12, 25, 13, 48, 55) # 2017년 12월 25일 13시 48분 55초

dt.day
Out[70]:
25
In [71]:
dt.hour
Out[71]:
13

datetime 객체에서 datetime 객체를 따로 추출할 수 있다.

In [72]:
dt.date()
Out[72]:
datetime.date(2017, 12, 25)
In [73]:
dt.time()
Out[73]:
datetime.time(13, 48, 55)

strftime 메소드를 이용해서 형식에 맞게 문자열을 얻을 수 있다. 한글 문자열을 사용하려면 locale 모듈을 이용해서 아래와 같이 설정해야 한다.

In [74]:
import locale

locale.setlocale(locale.LC_ALL, 'ko')
dt.strftime("%Y년 %m월 %d일: %H시 %M분 %S초입니다.")
Out[74]:
'2017년 12월 25일: 13시 48분 55초입니다.'

strptime 메소드는 거꾸로 문자열을 datetime 객체로 변환한다.

In [75]:
datetime.strptime("20180308140433", "%Y%m%d%H%M%S")
Out[75]:
datetime.datetime(2018, 3, 8, 14, 4, 33)

시계열 자료를 분류하다보면 시간을 변경해야할 상황이 발생한다. 가령, 분, 초를 모두 0로 변경하려면 replace 메소드를 사용한다.

In [76]:
dt.replace(minute = 0, second = 0)
Out[76]:
datetime.datetime(2017, 12, 25, 13, 0)

datetime 객체는 불변이기 때문에 replace 메소드의 반환값이 새로운 datetime 객체인 것을 알 수 있다.

두 개의 datetime 객체 사이의 차를 다음과 같이 계산할 수 있다.

In [81]:
dt2 = datetime(2018, 3, 8, 14, 26)

delta = dt2 - dt
delta
Out[81]:
datetime.timedelta(73, 2225)

반환값이 datetime.timedelta 객체인 것을 알 수 있다. datetime.timedelta(73, 2225)은 73일 2225초 차이라는 뜻이다. 차이를 dt에 더하면 새로운 객체가 생성된다.

In [82]:
dt + delta
Out[82]:
datetime.datetime(2018, 3, 8, 14, 26)
형식 의미 예제
%a 간략화된 요일 이름 Sun, Mon, …, Sat (en_US); 일, 월, …, 토 (ko)
%A 요일 Sunday, Monday, …, Saturday (en_US); 일요일, 월요일, …, 토요일 (ko)
%d 0이 붙은 일 표시 01, 02, …, 31
%b 간략화된 월 이름 Jan, Feb, …, Dec (en_US); 1, 2, …, 12 (ko)
%B 월 이름 January, February, …, December (en_US); 1월, 2월, …, 12월 (ko)
%Y 네 자리 년도 표시 0001, 0002, …, 2013, 2014, …, 9998, 9999
%y 두 자리 년도 표시 01, 02, …, 13, 14, …, 98, 99
%m 두 자리 월 표시 01, 02, …, 12
%H 0이 붙은 24시간 형식 시간 표시 00, 01, …, 23
%I 0이 붙은 12시간 형식 시간 표시 01, 02, …, 12
%p 오전, 오후 표시 AM, PM (en_US); 오전, 오후 (ko)
%M 분 표시 00, 01, …, 59
%S 초 표시 00, 01, …, 59
%f 마이크로초(백만분의 1초) 표시 000000, 000001, …, 999999
%c 지역 형식에 따른 날짜와 시간 표시 Tue Aug 16 21:30:00 1988 (en_US); 2018-02-14 오후 4:02:47 (ko)

흐름 제어

if, elif, else 문

if문만 사용할 수 있다.

if <참 거짓 판단 문장> :
    참 거짓 판단 문장이 참일때 실행

if - elif - else 문을 사용할 수 있다.

if <참 거짓 판단 문장1>:
    참 거짓 판단 문장1이 참일때만 실행
elif <참 거짓 판단 문장2>:
    참 거짓 판단 문장2가 참일때만 실행
else:
    위의 참거짓 문장들이 모두 거짓일 때 실행

andor를 이용한 결합 문장을 이용할 수도 있다.

a = -10; b = -9; c = 2

if a < b and b > c:
    print(b)

다음과 같이 연속적으로 비교를 해도 된다.

In [83]:
1 < 2 < 3 < 4
Out[83]:
True

for 문

for 문은 열거형(리스트, 튜플, 문자열) 또는 반복자(iterator) 객체에 대해서 반복을 실행한다.

for 성분 in <반복 가능 객체>:
    반복 실행 코드

continue 문을 이용해 반복을 건너뛸 수 있다.

sequence = [1, 2, None, 4, None, 5]
total = 0
for value in sequence:
    if value is None:
        continue
    total += value

break 문을 이용 반복문을 벗어 날 수 있다.

sequence = [1, 2, 0, 4, 6, 5, 2, 1]
total_until_5 = 0
for value in sequence:
    if value == 5:
        break
    total_until_5 += value

여러 개의 for 문이 중첩되었을 때 break는 가장 안쪽의 for 반복문을 벗어난다.

In [84]:
for i in range(4):
    for j in range(4):
        if j > i:
            break
        print((i, j))
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)
(3, 0)
(3, 1)
(3, 2)
(3, 3)

반복 가능 객체의 성분들이 튜플 또는 리스트라면 다음과 같이 직접 성분에 대입할 수 있다.

In [86]:
과일 = [('사과', 1000), ('배', 2000)]
for ,  in 과일:
    print("{} 가격은 한 개에 {}원 입니다.".format(, ))
사과 가격은 한 개에 1000원 입니다.
배 가격은 한 개에 2000원 입니다.

while 문

while 문은 다음과 같이 사용한다.

while <참 거짓 판단 문장>:
    참인 동안 실행될 코드

for 문과 마찬가지로 break 문을 만나면 반복을 끝낸다.

s = 0
e = 5

while s < 10:
    print(s)
    if s > e:
        break
    s += 1

pass 문

pass 문은 아무것도 실행하지 않는 문장을 넣어야 할 때 사용한다. 코드를 나중에 완성하고 싶을 때 다음과 같이 사용할 수 있다.

for x in range(10):
    if x < 5 :
        # 나중에 완성하자.
        pass # 이 문장이 없으면 오류 발생

range 함수

range() 함수는 등간격의 수에 대한 반복자를 반환한다.

In [87]:
range(10)
Out[87]:
range(0, 10)
In [88]:
list(range(10))
Out[88]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range(시작, 끝, 간격)과 같이 사용한다.

In [89]:
list(range(-2, 9, 2))
Out[89]:
[-2, 0, 2, 4, 6, 8]

간격은 음수를 사용해도 된다.

In [90]:
list(range(9, 0, -2))
Out[90]:
[9, 7, 5, 3, 1]

삼항 연산

파이썬은 if - else 문을 한 줄로 사용할 수 있는 삼항 연산을 제공한다.

반환값 = <참일때 실행 될 문장> if <참 거짓 판단 문장> else <거짓일 때 실행될 문장>

위 문장은 다음과 같이 쓸 수 있다.

if <참 거짓 판단 문장>:
    반환값 = <참일때 실행 될 문장>
else:
    반환값 = <거짓일 때 실행될 문장>
In [93]:
b = 0
x = 4 if b > 8 else 9
print(x)
9