프로그래밍의 기본은 변수로부터 시작됩니다. 변수는 을 저장하는 공간이며, 이 값은 변수의 타입에 따라 숫자, 문자열, 리스트 등이 될 수 있습니다. Python은 동적 타이핑을 사용하므로, 변수에 일단 값을 할당해 두고 나면 런타임에 타입 검사를 수행합니다. 변수의 값 할당은 assign(=) 기호를 사용합니다.

변수의 assign은 단순한 바인딩 구문이며, 이는 등호의 우변을 먼저 평가한 후 그 평가값을 좌변에 할당하게 됩니다. 따라서 우변 평가 -> 좌변 할당이라는 순서를 알고 있으면 좋습니다. Python의 변수는 기본 자료형Iterable 자료형으로 나누는 것이 좋고, 여기서는 기본 자료형에 대해서 다뤄 보도록 하겠습니다.

숫자형

Python의 숫자형은 정수, 실수를 포함해 숫자 형태로 이루어진 자료형입니다. Python의 모든 숫자 자료형은 최소값과 최대값에 대한 제한이 없습니다. Python의 숫자형은 아래처럼 나눌 수 있습니다.

  • 정수(int) : 말 그대로 정수 자료형입니다.
  • 실수(float) : 소수점이 포함된 숫자를 말하며, e 표기법도 사용할 수 있습니다. 다른 언어에서 실수를 다루기 위해 float과 double 타입이 따로 있는 것에 비해, Python은 float 타입만 사용합니다.
  • 8진수(int) : 0o로 시작되며 8진법으로 표현되는 정수를 뜻합니다.
  • 16진수(int) : 0x로 시작되며 16진법으로 표현되는 정수를 뜻합니다.

아래는 각 숫자형 데이터 타입들을 변수에 할당하는 예입니다.

사칙연산

다른 프로그래밍 언어들처럼, Python에서도 보편적으로 사용되는 사칙연산들이 당연히 지원됩니다.

  • + : 두 항의 합
  • - : 좌측 항에서 우측 항을 뺀 값
  • * : 두 항의 곱
  • / : 좌측 항에서 우측 항을 나눈 값(Python 2에선 무조건 소수점을 버리고 int를 리턴하지만, Python 3에선 최대 소수점 16번째 자리까지 표현된 float가 리턴됩니다. true div라고 부릅니다.)
  • % : 죄측 항에서 우측 항을 나눈 나머지

아래는 각 연산자의 예입니다.

Python은 사칙연산을 위한 몇 가지의 연산자를 더 지원하고 있습니다.

  • // : 좌측 항에서 우측 항을 나누어 소수점 아랫 자리를 버린 값(floor div라고 부릅니다.)
  • ** : 좌측 항에서 우측 항 만큼 제곱한 값

아래는 floor div와 제곱 연산자의 예입니다.

문자열

문자열(String)은 문자, 단어 등으로 구성된 문자들의 집합을 의미합니다. C, Java에서는 문자(char)문자열(string)을 따로 분류하고 있지만, Python은 문자를 다루는 경우 길이에 상관 없이 문자열로 통일하고 있습니다. 아래는 모두 문자열입니다.

  • PlanB
  • a

마지막은 blank를 뜻합니다. 아무 문자도 들어가 있지 않더라도 문자열로 취급할 수 있다는 것입니다. 다른 언어에서 작은 따옴표(')로 감싸는 형태의 char 자료형이 없는 만큼, 문자열을 감싸는 방식은 여러가지가 있습니다.

문자열 포매팅

문자열 포매팅은 문자열 안에 특정 값을 삽입하는 것을 말합니다. 여기서 특정 값은 대체적으로 변수입니다. 포맷 코드를 이용할 수도 있고, 문자열의 format 메소드를 사용할 수도 있습니다.

보편적으로 인덱스가 제거된 포매팅 문자열과 format 메소드를 사용하는 3번을 사용합니다.

문자열을 서로 더하거나, 정수와 곱하거나, 일부를 자르는 등 수많은 작업들을 할 수 있지만 여기선 자료형에 대해서만 알아보기로 했으므로(이후의 Iterable 객체와 연관되기도 하므로) 다음으로 미루도록 하겠습니다.

bytes

Python은 byte로 이루어진 문자열을 위해 bytes라는 타입을 지원합니다. Python에서는 바이트 문자열을 b'abcd'와 같은 방식으로 표현합니다. 실제로 변수에는 인코딩된 상태로 할당됩니다.

Bool

불린(Boolean)참(True) 또는 거짓(False)만을 값으로 가질 수 있는 자료형입니다. 참고로 다른 언어의 boolean 자료형과 다르게 첫 문자가 대문자로 시작되는 True, False를 사용한다는 점입니다.

None

None'아무 데이터를 가지고 있지 않다'라는 것을 표현하기 위해 사용합니다. Java의 null과 다르게, None이라는 값도 하나의 객체(NoneType)입니다.

타입 캐스팅

문자열 '1'을 숫자 1로 변환하고 싶다면, 타입 캐스팅을 이용할 수 있습니다. 파이썬에서 제공되는 빌트인 함수들을 사용할 수 있습니다.

자료형의 참과 거짓

bool('hello')가 True, bool('')가 False인 이유는 Python의 모든 자료형엔 참과 거짓이 있기 때문입니다.

  • 숫자 : 0, 0.0, 0o0, 0x0은 거짓이며, 나머지는 모두 참입니다.
  • 문자열 : 빈 문자열('')은 거짓이며, 나머지는 모두 참입니다.
  • bool : True는 참이며, False는 거짓입니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - Dictionary, Set  (0) 2018.06.20
[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 주석  (0) 2018.06.17
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 설치  (0) 2018.06.15

프로그래밍에 있어 주석(Comment)은 정말 중요합니다. 굉장히 아이러니하지만, 내 코드를 내가 이해하지 못하는 경우가 생각보다 많습니다. 조건문의 조건식이 복잡해지고, 반복문이 다중으로 구성되는 등, 코드의 복잡도가 늘어날수록 주석 없이는 코드를 이해하기 힘들어집니다. 주석은 컴파일 타임에 제외되는, 가독성을 높이기 위한 한 줄 이상의 설명문입니다.

많은 프로그래밍 언어들은 주석을 //로 시작하여 작성하고, 여러 줄에 걸쳐 주석을 작성하는 경우 /* */ 형태를 사용합니다.

Python은 #으로 시작하는 문장을 주석으로 간주합니다. 여러 줄에 걸쳐 주석을 작성하는 경우 """(큰 따옴표 3개) 사이에 작성하면 됩니다.

사실, '클린 코드(Clean code)'라는 명저에서는 '주석은 설명을 붙여 나쁜 코드를 회피하려는 것'이라고 설명하며 주석에 대해 회의적인 입장을 가지고 있습니다. 실제로 주석 없이도 쉽게 이해 가능한 매우 깔끔한 코드를 작성하는 게 순효과가 더 많기도 합니다. 그러나 우리는 그만큼의 직관성을 가진 코드를 작성하기 위한 경험이 부족하니, 지금은 '클린 코드'가 말했던 대로 주석으로나마 나쁜 코드를 회피할 수밖에 없는 입장입니다. 주석 없이도 이해되는 코드를 작성하는 것은 개발자의 역량이므로, 무조건 주석을 붙이는 것보다 깔끔하고 직관적인 코드를 작성하는 것에 더 집중하는 것이 좋을 것 같다는 게 제 입장입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 설치  (0) 2018.06.15
[Python] 개요  (0) 2018.06.14

사실 다른 언어에 비해 Python은 'Hello World'의 출력이 일깨워주는 범위가 그리 크지 않습니다. 그러나 이건 장점입니다. 아래는 Java의 Hello World 코드입니다.

콘솔에 출력되는 건 'Hello World' 하나지만 코드에는 객체지향, 클래스, 메소드, 접근 제한자, static 키워드, 변수, String 배열, 도트 연산 등의 개념이 들어가 있습니다. Java 입문자가 Hello World를 따라 치고 나서, 이 5줄의 코드 전체를 이해하기 위해선 더 많은 공부가 필요한 것입니다. 아래는 Python의 Hello World 코드입니다. Python 모듈의 확장자는 .py입니다.

Python은 멀티 패러다임 언어로서 명령형 프로그래밍도 가능하기 때문에, Java의 public static void main처럼 명시적인 entry point가 없어 매우 간결합니다. 이건 Python을 좋아하지 않는 개발자가 봐도 직관적이라고 말할 것입니다. 이 코드를 보면, 'Python에서는 콘솔 출력을 위해 print라는 함수를 사용한다'라는 내용을 이해할 수 있습니다. 똑같이 'Hello World 출력하기'지만, Python에서는 정말로 출력 코드 하나만을 사용했습니다. '함수'나 '문자열 감싸기'같은 프로그래밍 자체의 배경지식 정도만 필요한 것입니다. 이와 같은 간결함과 직관성, 가독성은 Python에게 강력한 무기입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] 주석  (0) 2018.06.17
[Python] 설치  (0) 2018.06.15
[Python] 개요  (0) 2018.06.14

Python은 C로 구현되었으며, 따라서 많은 사람들이 일반적으로 이야기하는 Python은 CPython을 이야기합니다. 그러나 .NET 기반의 IronPython, JVM 기반의 Jython, RPython 기반의 Pypy 등 특별한 목적을 위한 여러가지 구현체가 존재하며, CPython 자체도 ActivePython이나 Anaconda같은 여러 가지 배포판이 존재합니다. 여기서는 python.org에서 제공하는 공식 Python(CPython) 3를 설치하고 기본 설정을 진행하도록 하겠습니다. 참고로 CPythonCython은 엄연히 다른 구현체입니다.

Python의 버전

Python의 버전은 크게 Python 2Python 3로 나뉩니다. 파이썬의 사용자가 늘며 Python 2의 여러 단점들이 지적되었고, 과감하게 하위 호환성을 포기하고 Python 3000이라는 코드명으로 개발하기 시작하여 Python 3가 발표되었습니다. Python 3.4부터 강력한 기능들을 제공하기 시작하여, 그 이후부턴 대부분의 파이썬 패키지들이 Python 2/3 겸용이나 Python 3 전용으로 개발되고 있습니다. Ubuntu 16.04도 기본 파이썬 버전이 3.5로 바뀌었습니다. 이제는 Python 3라는 것입니다.

Python의 여러 구현체

Python은 오픈 소스 문화의 한 가운데에 있는 프로젝트입니다. Python의 인기가 많아지며, 수많은 프로그래밍 언어를 이용한 Python 구현체가 개발되고 있습니다.

CPython

Python이라고 이야기하면 대부분 CPython을 뜻합니다. C로 개발되었고, 표준 구현체이며 가장 많이 사용되고 있는 Python 구현체입니다. 오픈 소스 프로젝트로 진행되고 있습니다. Python 코드를 바이트코드로 컴파일하고, 그 결과를 가상머신이 해석하는 방식을 사용합니다.

Cython

Type mixin을 사용하여 C나 C++ 모듈로 컴파일하여 성능을 크게 향상하는 것이 주 특징인, Python용 정적 컴파일러 최적화입니다.

IronPython

.NET FrameworkMono 기반에서 작동할 수 있도록 C#으로 개발된 Python 구현체입니다. 마찬가지로 오픈 소스 프로젝트입니다.

Jython

JVM 기반에서 작동할 수 있도록 Java로 개발된 Python 구현체입니다. 오픈 소스 프로젝트입니다.

Python 배포판

Stackless Python

Python이 기존에 가지고 있던 스레드와 관련된 성능 및 복잡성 문제 없이 스레드 기반 프로그래밍의 이점을 누릴 수 있는 Python의 향상된 버전입니다. 인터프리터를 호출 스택과 분리함으로써 코드 실행 순서를 변경할 수 있는 기능이 있습니다. tasklet이라는 컨셉을 도입하여 함수를 마이크로스레드로 바꾸고, 이를 직렬화(serialization)하거나 RR 스케줄링할 수도 있습니다. 오픈 소스 프로젝트입니다.

Pypy

정적 타이핑을 사용하고, 효율적인 정적 컴파일을 위해 기능을 제한하고 있는 RPython(Restricted Python)으로 작성되었습니다. JIT 컴파일러를 제공하며, C, CIL, JVM 바이트코드와 같은 것들을 지원하여 속도, 효율성 및 기존 CPython 인터프리터와의 호환성에 중점을 둡니다. Python을 매우 빠르게 만드는 데에 목적이 있습니다. 오픈 소스 프로젝트입니다.

이 외의 구현체들은 여기에서 확인해볼 수 있습니다.

설치

Mac에서 설치

Mac이라면 Homebrew를 통해 간편하게 설치할 수 있습니다.

$ brew install python3

Mac을 비롯한 Linux 기반 운영체제들은 Python을 Python 2와 Python 3로 나누고 있으므로, 기본 python 커맨드는 Python 2를 나타내며 Python 3를 위해서는 python3 커맨드를 이용해야 한다는 것을 알고 있기 바랍니다. 또한, Mac에는 기본적으로 Python 3.5가 탑재되어 있으므로 Python 3.5를 사용해도 큰 문제는 없습니다.

$ python3
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Windows에서 설치

공식 Python 웹페이지에서 설치할 수 있습니다. Downloads 탭에서 최신 버전의 python 3을 설치하고, 아래 커맨드를 입력했을 때 파이썬 인터프리터가 동작하면 정상적으로 설치된 것입니다.

$ python

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] 주석  (0) 2018.06.17
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 개요  (0) 2018.06.14

드디어 Python에 대한 글을 쓰게 되었습니다. 2018년 6월 13일 현재 제가 가장 좋아하고, 오래 사용한(그래봤자 1년 반 쓴) 언어입니다. Flask로 인해 2017년부터 쓰기 시작했고, 지금까지 계속해서 사용해오고 있습니다.

Python은 C로 구현되었고, 1991년에 발표된 인터프리터, 동적 타이핑, 바이트코드 컴파일, 객체지향을 지원하는 멀티 패러다임 언어입니다. 파이썬은 객체지향 언어 아닌가?하는 사람들도 많지만, Python은 절차지향, 객체지향, 함수형 패러다임 모두 표현할 수 있으므로 객체지향을 지원하는 멀티 패러다임으로 봐야 한다는 입장이 많으며 저도 이와 같은 입장입니다. 애초에 Python이 class를 이용해 객체지향을 지원하지만, 클래스 없이도(객체지향적 표현 없이도) 충분히 코드를 작성할 수 있으므로 객체지향이라고 단정지을 수는 없습니다.

심심하면 작품이 나오는 공돌이들 답게, Python도 크리스마스에 연구실이 닫혀 있어서 심심한 김에 만들어졌습니다. 창시자는 네덜란드의 귀도 반 로썸(Guido van Rossum)입니다. Python은 현재 실무와 교육 양 쪽에서 엄청난 인기를 끌고 있고, 점유율도 급속도로 올라가고 있습니다. Glue language라는 특징 덕분에 다른 언어(특히 C, C++)로 작성된 코드를 바인딩할 수 있고, 그 좋은 예가 Tensorflow, Keras입니다. 문법이 쉬워 배우기는 쉽지만, 다른 언어가 다 그렇듯 잘 쓰기는 어렵습니다.

인터프리터

컴파일 언어인 C, Java에 비해 Python은 인터프리팅 언어입니다. 컴파일러는 코드 전체를 기계어로 번역하는 데에 반해, 인터프리터는 코드를 한 줄씩 읽어들여 실행합니다. Python은 코드를 한 줄씩 읽어들이는 인터프리터 방식이며, 따라서 프로그래밍을 아래처럼 대화식으로 할 수 있습니다.

문화

다른 언어들에서는 쉽게 찾아볼 수 있는 파이썬만의 독특한 매력이 있는데, 바로 문화입니다. 파이썬이 성장하며 가장 아름다운 하나의 답이 존재한다라는 파이썬의 명제가 성장해 왔습니다. 다른 언어들의 코딩 스타일은 각자의 취향에 맞게 진화하는 반면(C 계열의 중괄호 위치 등), 파이썬은 위의 철학을 만족시키는 하나의 스타일로 진화해 왔습니다. 이에 PEP8이라는 제안서(코드 스타일 가이드)가 보편적인 코딩 컨벤션으로 자리를 잡으며 파이썬스러움(Pythonic)이라는 단어가 유명해지게 되었는데, 복잡하지 않으면서 의미가 명확하고, 심플한 파이썬의 철학을 따르는 코드들을 지칭하는 개념입니다. 그래서 처음 보는 개발자 둘이 파이썬 코드를 작성하더라도, 코드의 레이아웃이나 컨벤션들이 거의 비슷합니다.

진입장벽

파이썬 코드는 프로그래밍을 한 번도 해보지 않은 사람조차도 소스 코드를 통해 프로그램이 어떤 일을 하는지 이해할 정도로 접근하기 쉬운데, 바로 가독성 때문입니다. 가독성(readability)은 파이썬 디자인의 핵심이며, 코드 작성자가 코드를 작성하는 데 소요하는 시간보다 수많은 사람이 코드를 읽는데 소요하는 시간이 훨씬 길다는 인식이 바탕에 깔려 있습니다.

파이썬 코드가 비교적 쉽게 이해되는 것은 완전한 코드 스타일 가이드라인 모음집(PEP8과 PEP20 개선 제안)과 Pythonic이라는 관용어 때문입니다. 베테랑 파이썬 개발자가 코드의 일부분을 '파이썬스럽지 않다'고 한다면, 그 부분은 일반적으로 통용되는 가이드라인에 따라 작성되지 않았으며, 가독성을 고려한 코드 작성에 실패했음을 의미합니다. 그러나 멍청한 일관성은 소인배의 발상(a foolish consistency is the hobgoblin of little minds)이긴 합니다.


사실 블로그에 글을 쓰기 전, Python을 한창 배우던 당시에 Awesome Python이라는 레포에 꾸준한 공부와 복습을 위해 코드 스니펫들을 올리곤 했었습니다. 예제를 다듬고, 순서를 바꾸고, 설명을 추가하며 그렇게 1년동안 쌓다 보니, 다른 사람들도 꽤 볼만 한 예제 저장소가 되어 있었습니다. 파이썬 기초, 여러 기법들, 빌트인 함수와 라이브러리, 쓸만 한 외부 라이브러리, Flask로 나누어 정리하고 있습니다. 코드만이 아니라 글로써 가이드를 하나 작성해보고 싶었고, Python을 가지고 '드디어'라고 말한 이유도 이것입니다.

여기선 '책' 얘기를 해보고 싶습니다. 프로그래밍 관련 서적은 대부분 한 번만 읽으면 졸업할 수 있는 책두고두고 다시 보는 책으로 나뉩니다. 첫 번째 부류의 쉬운 책은 많은데, 두 번째 부류의 비급같은 책은 적습니다. 특히 파이썬은 '쉽다'라는 특징 때문에 그런 경향이 더 많습니다. 쉽다는 장점이 의외로 단점을 가져오는데, 자유롭게 쓸 수 있는 시점이 빨리 다가오기 때문에 '다 알았다'는 느낌이 들어서 배우기에서 빨리 손을 떼는 경우가 많다는 것입니다. 프로그래밍 언어는 단순히 문제를 해결하기 위한 도구일 뿐이지만, 고급자로 올라서길 원하는 경우엔 참고할 만한 자료들이 그리 많지 않습니다. 앞으로 올라갈 글들은 두 부류에 모두 속할 수 있도록 하려고 합니다.

앞으로 올라갈 글들은 Python이라는 언어를 위주로 설명하기에 객체지향, 연산자의 우선순위, 정적 타이핑과 동적 타이핑 등 프로그래밍 자체의 배경지식에 해당하는 부분들은 많이 설명하진 않으려고 합니다. 따라서 'Python과 함께하는 프로그래밍 입문'보단 'Python 입문'같은 느낌에 더 가까우며 '기본서'와는 조금 거리가 있을 수도 있습니다. C나 Java같은 타 언어를 통해 프로그래밍 자체에 대해 조금 학습했거나, 점프 투 파이썬과 같은 튜토리얼을 통해 Python을 한 번쯤 경험해본 사람들이 읽기 쉽도록 작성할 계획입니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] 주석  (0) 2018.06.17
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 설치  (0) 2018.06.15

+ Recent posts