조건문을 이용해 코드를 간단히 제어해 봤고, 반복문을 사용하여 코드를 제어할 수도 있습니다. 동일한 코드를 일정 수만큼 반복해서 수행해야 할 경우 반복문을 사용하며, 리스트의 모든 요소를 출력하는 등의 일이 여기에 속합니다. Python은 반복문을 위해 for를 지원합니다.

for문 작성하기

for는 Python에서 반복문을 작성하기 위한 키워드로, 기본적으로 for-each(iterable 자료형 참조) 형태를 띱니다. 따라서 for-in으로 알고 있는 것이 좋습니다.

위는 List의 값을 순차적으로 접근하는 형태의 전형적인 for문이며, 아래는 unpacking을 활용한 for문의 응용을 나타냅니다. 사실 타 프로그래밍 언어의 반복문을 경험해 보았다면, n부터 m까지 반복 형태의 반복문이 더 익숙할 것입니다. Python의 반복문은 for-each 방식이기 때문에, range라는 함수를 사용해야 합니다.

위처럼, range(n)0부터 n-1까지의 숫자를 가지고 있고, range(n, m)n부터 m-1까지의 숫자를 가지고 있습니다. 사실 Python 3에서의 range() 함수는 range 객체를 반환하는 것이지만, 여기서는 그냥 iterable 자료형, List 등 편한 대로 이해하고 넘어갑시다.

break, continue statement

breakcontinue를 이용해서 반복문을 제어할 수 있습니다. break는 반복문을 종료하고, continue는 현재 루프를 건너뛰고 다음 루프로 제어를 넘깁니다.

for - else

Python은 for문에서도 else를 사용할 수 있습니다. for문에서 break가 발생하지 않고 모든 루프가 성공적으로 돌면 else 블럭 내부의 코드가 실행되는 형태입니다.

특정 작업을 수행하는 for문에서 break가 발생하지 않았다는 것은 암시적으로 '모든 작업에 성공했다'는 것을 의미합니다. 따라서 이와 같은 판단을 위해 for-else문은 꽤 필요성이 많은 문법이라고 볼 수 있습니다.

List Comprehension

1부터 100까지의 수 중 짝수만으로 이루어진 리스트를 만들어야 한다면, 아래처럼 코드를 작성할 수 있을 것입니다.

충분히 괜찮은 코드지만, 해당 로직은 결국 1부터 100까지 반복하며 - 조건을 판단하고 - 리스트에 값을 누적하는 형태입니다. Python에서는 nested(포함된) for문을 이용해 iterable 객체를 만드는 comprehension이라는 개념을 지원하고, 아래와 같이 사용합니다.


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

[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - while  (0) 2018.06.23
[Python] 조건문 - if  (0) 2018.06.21
[Python] Iterable 자료형 - Dictionary, Set  (0) 2018.06.20
[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19

이제 제어라는 주제로 넘어갑니다. 그동안 제어가 없는 코드를 작성했는데, 이 경우 위에서 아래로 멈추지 않고 코드가 진행됩니다. 프로그래밍 분야에서 '제어'는 어느 코드를 실행할지를 결정하는 주체인데, 이번에는 if를 이용해 조건문을 작성하고, 코드의 흐름을 제어해 봅시다. if [condition] 형태로 작성합니다.

if문 작성하기

if는 Python에서 조건문을 작성하기 위한 키워드로, 조건을 판단하여 해당 조건에 맞는 작업을 수행하는 데 쓰입니다.

다른 프로그래밍 언어에서 블럭을 표현하기 위해 중괄호({})를 사용하는 데에 반해, Python에서는 콜론(:)들여쓰기로 블럭을 표현합니다. 조건문은 if, elif, else를 혼합해서 사용할 수 있으며, elif는 타 언어의 else if 구문과 동일한 역할입니다. elif와 else는 상위의 if문 없이 단독으로 사용 불가능합니다.

비교 연산자

조건문은 True나 False로 평가되는 condition을 판단합니다. a가 10보다 큰 경우와 같은 조건식을 작성하려면, 비교 연산자를 사용할 수 있습니다.

  • x < y : x가 y보다 작은 경우 True
  • x <= y : x가 y보다 작거나 같은 경우 True
  • x > y : x가 y보다 큰 경우 True
  • x >= y : x가 y보다 크거나 같은 경우 True
  • x == y : x와 y가 같은 경우 True
  • x != y : x와 y가 다른 경우 True

비교 연산자는 chaining(이어 붙이기) 가능합니다. a가 5 이상, 10이하인 경우5 <= a and a <= 10이라는 조건식을 사용할 수도 있지만, 아래처럼 비교 연산자를 체이닝하는 것이 더 직관적입니다.

논리 연산자

a가 10보다 크고 짝수인 경우와 같은 조건식을 작성하려면, 논리 연산자를 사용할 수 있습니다. 타 언어에선 &&, ||, !와 같은 키워드로 사용되는데, Python은 이들을 and, or, not과 같이 키워드로서 표현합니다.

in 키워드

Python은 iterable 자료형을 정말 잘 지원하고 있다고 했습니다. 특정 값 x가 iterable 자료형에 들어 있는지를 검사하려면 in 키워드를 사용하면 됩니다. 또한, Bool 연산자인 not은 in에도 적용 가능하므로 '해당 값이 들어 있지 않은지'도 검사할 수 있습니다.

삼항 연산자

True일 때 x 리턴, False일 때 y 리턴과 같은 로직을 작성하려면, 아래처럼 if문을 작성할 수 있습니다.

'nickname' 이라는 key가 딕셔너리에 있으면 d['nickname']을 출력하고, 없으면 d['name']을 출력하는 코드입니다. Python은 삼항 연산자를 지원하며, 아래처럼 사용할 수 있습니다.

[condition이 True일 때의 리턴값] if [condition] else [condition이 False일 때의 리턴값] 형태로 사용합니다. 물음표와 콜론을 사용하는 타 언어의 삼항 연산자와 비교하더라도 의외로 가독성이 높습니다.

이전에 List와 Tuple을 다뤄 봤습니다. 이 둘은 값의 나열을 다루며, 순서가 보장되기 때문에 인덱싱과 슬라이싱이 가능했죠. 이번에 다뤄 볼 Dictionary와 Set도 Iterable 자료형이지만, List나 Tuple과는 조금 다릅니다.

Dictionary

Dictionary는 Key-value 쌍으로 표현되는 자료형입니다. 사람에 대한 정보는 이름=조민규, 닉네임=PlanB처럼 표현할 수 있듯, Dictionary라는 단어의 뜻처럼 사전처럼 데이터를 관리합니다.

값 조회하기

List와 Tuple은 인덱스로 값을 조회했던 것에 비해, 딕셔너리는 key를 통해 값을 조회합니다.

값 추가, 수정, 제거하기

Dictionary는 값 추가, 수정, 제거가 자유롭습니다.

Set

Set은 수학의 집합과 비슷한 자료형입니다. 중복을 허용하지 않고, 순서가 없습니다. 사실 수학의 집합 개념을 사용하거나, 중복을 제거하는 용도가 아니면 자주 사용하지는 않습니다.

값 추가, 수정, 제거하기

Set은 Tuple과 다르게 mutable(가변) 자료형이기 때문에 값을 자유롭게 추가, 수정, 제거할 수 있습니다. 그러나 다른 iterable 자료형에 비해 문법적으로 조금 다릅니다.

List에서 중복된 값 없애기

Set은 중복을 허용하지 않기 때문에, List와 같은 자료형에서 중복된 값을 없애기 위해서 자주 사용됩니다.

문자열 이야기

문자열도 Iterable이며 순서가 보장되는 자료형입니다. 따라서 인덱싱과 슬라이싱, 합과 곱 연산이 가능합니다.

Unpacking

Iterable에는 unpacking이라는 개념이 있습니다. 객체의 각 요소들을 풀어 변수에 대입하는 것입니다. Python 3에는 확장 언패킹(extended unpacking)이라는 개념도 존재합니다.

Unpacking의 반대 개념으로 packing이 있는데, 사실 우리가 위에서 Iterable 객체에 리터럴로 값을 대입했던 것들이 모두 packing에 속합니다.

타입 캐스팅

Iterable 타입 간 타입 캐스팅도 자유롭습니다. 단, list/tuple/set을 dictionary로 캐스팅할 수는 없습니다.

Iterable 타입의 참과 거짓

Iterable 타입의 참과 거짓을 판단하는 기준은 정말 간단합니다. 비어 있으면 False, 비어 있지 않으면 True입니다.

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

[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21
[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] 주석  (0) 2018.06.17

프로그래밍을 하다 보면 서로 연관된 연속적 데이터를 하나의 변수에 모아 두면 좋은 상황이 생깁니다. Java와 같은 언어에서 List, Map과 같은 Collections API를 지원하는 것처럼, Python에서는 이를 위해 Iterable 자료형을 지원합니다. Iterable 자료형을 보면, '파이썬답다'라는 생각이 가장 먼저 듭니다. Iterable은 반복 가능한이라는 뜻인데, Python은 반복(iteration)이라는 개념을 정말 잘 지원하고 있고, Python의 간결함은 Iterable 자료형에서 오는 경우가 많으므로 잘 알고 있어야 합니다.

Iterator pattern(반복자 패턴)이 떠오를 수 있는데, 이는 사실 이미 디자인 패턴으로 정형화되어 있기 때문입니다. 연속된 데이터를 포함하고 있는 자료의 요소들을 순회할 수 있는 방법을 제공하는 패턴을 Iterator pattern이라고 합니다. 대부분의 언어에서 Iterator pattern을 문법적인 요소들로 제공(Java의 Collections 등)하고 있기는 하지만, Python만큼 언어에 자연스럽게 녹아 있는 경우는 많지 않습니다.

Python의 대표적인 iterable 자료형은 아래처럼 분류됩니다.

  • List : 가장 일반적인 iterable 자료형입니다. 값 접근, 추가, 수정, 삭제가 자유롭습니다.
  • Tuple : List와 유사하지만, Tuple은 한 번 정의하고 나면 값 접근은 가능하지만 추가, 수정, 삭제가 불가능합니다. Read-only List라고 생각할 수 있습니다.
  • Dictionary : key-value 쌍으로 이루어진 자료형입니다.
  • Set : 수학의 집합 개념과 비슷합니다. 중복을 허용하지 않으며, 순서가 보장되지 않습니다.

Python의 모든 iterable 자료형은 각 요소의 데이터 타입이 자유롭습니다. 하나의 List에 정수, 실수, 문자열 등이 함께 들어갈 수 있다는 것입니다.

List

가장 일반적인 iterable 자료형이라고 했습니다. List는 값을 다루는 부분에 있어 매우 자유롭습니다. List를 만들 때는 아래처럼 대괄호([ ])로 감싸 주고 각 요소들은 쉼표로 구분합니다.

인덱싱과 슬라이싱

Python에선 List에 접근하기 위해 타 프로그래밍 언어들의 배열 접근 방식과 비슷한 인덱싱이라는 개념을 지원하고, 추가적으로 슬라이싱이라는 개념도 있습니다. 이 둘을 이용해 각 요소에 접근하고, 특정 집합을 잘라낼 수 있습니다. 대부분의 프로그래밍 언어에서 이와 같은 인덱싱은 보통 zero-based numbering(0부터 시작)한다는 것을 참고하기 바랍니다.

del이라는 키워드를 사용했는데, 제대로 이해하려면 매직 메소드라는 개념을 알아야 하므로 여기서는 'Iterable 객체의 특정 요소를 제거하기 위한 키워드'라고만 이해하고 넘어가도록 합시다.

합과 곱

Python의 List는 서로 합하고, 정수와 곱할 수 있습니다.

값이 모두 n이고 길이가 m인 리스트 만들기

List의 곱을 이용해 값이 모두 n이고 길이가 m인 리스트를 만들 수 있습니다. [n] * m 코드를 사용하면 됩니다.

Tuple

Tuple은 Read-only(불변) List라고 생각할 수 있습니다. List처럼 나열된 값을 다루지만, 한 번 선언되고 나면 값의 생성, 수정, 삭제가 불가능합니다.

인덱싱과 슬라이싱

Tuple도 List와 동일한 형태의 인덱싱과 슬라이싱이 가능합니다.

합과 곱

Tuple도 서로 합하고 정수와 곱할 수 있습니다. 합과 곱은 해당 연산의 결과를 리턴하므로, 실제 튜플에는 변동이 생기지 않기 때문에 Read-only의 룰을 위반하지 않으므로 가능한 것입니다.


프로그래밍의 기본은 변수로부터 시작됩니다. 변수는 을 저장하는 공간이며, 이 값은 변수의 타입에 따라 숫자, 문자열, 리스트 등이 될 수 있습니다. 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

저는 검색 엔진에 대한 지식이 없다 보니, Tistory 블로그를 개설한 이후 하루에 글 하나씩을 열심히 쓰는데도 검색 결과에 노출이 되지 않는 이유를 모르고 있었습니다. 기본적으로 Tistory 블로그에 일정량 이상의 포스트가 쌓이면 각 검색 엔진의 봇들이 방문하여 크롤링하기에 자연적으로 검색 엔진에 인덱스되지만, 글이 충분히 쌓이지 않았던 블로그의 초기에도 구글의 검색 결과에서 블로그가 원활하게 노출되길 원했습니다. 여기서는 구글네이버의 검색 결과에 블로그를 노출시키는 방법에 대해서 가이드합니다.

개요

여기서 설명하는 건 SEO(Search Engine Optimization, 검색 엔진 최적화)와 큰 관련은 없습니다. SEO는 상위 랭크를 원하는 검색 엔진의 알고리즘을 분석하는 것으로 시작하나 여기선 검색 반영 신청을 하는 것에 가깝습니다. 물론 SEO에서 자주 사용되는 sitemaprss 등을 이용하기는 합니다.

sitemap.xml 준비

Sitemap은 사이트의 페이지에 대한 정보를 검색 엔진의 크롤러에 알리는 방법입니다. 검색 엔진에서 사이트를 보다 지능적으로 크롤링할 수 있도록 각 URL에 대한 추가 메타데이터와 함께 사이트에 대한 URL을 나열하는 XML 파일입니다. 사이트의 설계도라고 생각하면 됩니다. 아래는 제 블로그의 sitemap.xml 중 일부입니다.

Sitemap을 만들어 주는 무료 웹서비스가 많습니다. 여기에 접속해서 sitemap.xml을 만들어 보도록 합시다.

위처럼 블로그 주소를 입력한 후 Create Sitemap을 클릭합니다.

Sitemap 생성이 진행될 것이며, 블로그 포스트가 많을수록 더 오래 걸립니다. 생성이 완료되면 sitemap.xml 파일을 다운로드받아 저장하고, 해당 sitemap.xml을 비공개 글에 파일 형태로 첨부하여 업로드한 후 파일의 다운로드 링크를 복사해 둡니다.

네이버 웹마스터

네이버의 검색 결과에 블로그를 노출시키려면 네이버 웹마스터를 이용합니다. 네이버 계정으로 로그인하면 '연동 사이트 목록'이라는 대시보드로 이동되며, 아직 연동한 사이트가 없으므로 아래처럼 표시될 것입니다.

사이트 추가

사이트 추가를 눌러 블로그 URL을 입력하고, 확인을 누릅니다.

해당 사이트(블로그)의 소유를 확인하는 절차를 거칩니다. HTML 파일을 직접 업로드하는 방식은 어려우므로, HTML 태그를 이용하도록 합시다.

 width=

제공된 meta 태그를 <head> 섹션에 붙여넣어야 합니다. 블로그관리 - 꾸미기 - 스킨 편집 - html 편집에 들어가 붙여넣습니다.

확인을 누르면 등록이 완료되고, 대시보드의 '연동 사이트 목록'에 블로그가 추가된 것을 확인할 수 있습니다.

RSS 제출

블로그 URL을 누르고, 요청 탭에서 RSS 제출을 눌러 RSS를 제출합니다. Tistory 블로그의 RSS URI는 기본적으로 /rss입니다.

Sitemap 제출

같은 요청 탭에서 사이트맵 제출을 눌러 sitemap을 제출할 수 있습니다. 준비해 두었던 sitemap.xml 다운로드 링크를 붙여넣고, attachment/... 부분부터 보이도록 수정합니다.

확인 버튼을 누르고 나면 sitemap 제출이 완료됩니다.

Google search console

구글 검색 결과에 블로그를 노출시키려면 Search Console을 이용합니다. Google 계정으로 로그인하면 아래처럼 웹사이트를 추가할 수 있을 것입니다.

사이트 추가

블로그 URL 입력 후 속성 추가 버튼을 누르고 나면, 네이버 웹마스터와 동일하게 사이트의 소유권을 확인합니다. 대체 방법 탭에 들어가 HTML 태그를 누르고, 네이버 웹마스터에서 소유권을 확인했던 것과 동일하게 meta 태그를 <head>에 추가합니다.

이후 확인 버튼을 누르면 속성 추가가 완료되고, 아래처럼 Search Console에 블로그가 등록됩니다.

RSS 제출

블로그 URL을 누르고, 크롤링 탭에서 Sitemaps 페이지를 누른 후 SITEMAP 추가/테스트 버튼을 눌러 RSS를 제출합니다. Tistory 블로그의 RSS URI는 기본적으로 /rss입니다.

Sitemap 제출

같은 SITEMAP 추가/테스트 버튼을 이용해 sitemap을 제출할 수 있습니다. 준비해 두었던 sitemap.xml 다운로드 링크를 붙여넣고, attachment/... 부분부터 보이도록 수정합니다.

제출 버튼을 누르고 나면 sitemap 제출이 완료됩니다. 제출하고 나면, RSS와 Sitemap에 대해 아래와 같은 구글 검색 엔진을 통한 인덱싱이 접수된 것을 확인할 수 있습니다.

+ Recent posts