파이썬

내위키

Python.

네덜란드 출신 프로그래머인 귀도 판 로섬이 만들어 낸 프로그래밍 언어. 1989년 크리스마스 때 연구실은 문이 닫혀 있고, 뭔가 몰두할 만한 "취미" 프로그래밍 프로젝트가 있었으면 해서 시작한 게 파이썬이 되었다고 한다. 심심해서 만들었는데 세상을 뒤흔들었다는 말을 우리는 믿어야 한다. 하긴 뭐 리눅스도 시작은 재미로 한 거라... 다만, 그냥 뜬금 없이 심심해서 만든 것은 아니다. 파이썬에 가장 많은 영향을 준 언어로 ABC가 손꼽히는데, 로섬은 몇 년 동안 이 언어의 개발에 참여한 바가 있다. 1987년에 첫 버전이 나왔지만 이렇다 할 호응을 얻지 못하고 1990년을 끝으로 개발이 중단되었는데, 여기서 얻은 경험이 파이썬 언어를 만드는 데 밑거름이 되었다.[1]

리눅스리누스 토르발스처럼 귀도 판 로섬 역시 파이썬의 '자비로운 종신 독재자'였지만[2] 2018년 7월, 이 자리를 내놓겠다고 밝혔다.[3][4] 뭐 하나 바꾸려면 하도 지랄하는 인간들이 많아서 짜증나서라고... 후임은 임명하지 않을 것이며 앞으로는 집단 결정이 될 것이라고 말했다. 다만 "파이썬을 떠나지 않고, 평범한 핵심 개발자로서 계속 멘토링을 할 것"이라고 밝혔다.

역사는 길지 않은 편이지만 쉬운 사용법과 모듈을 이용한 강력한 확장성으로 큰 인기를 끌고 있으며, 특히 각자의 필요에 맞는 간단한 프로그램을 빠르게 만들기에 좋은 도구다. 실제 미국 대학에서는 학과에 관계 없이 파이썬을 배우는 사람들이 많다. 자료 정리나 간단한 통계 처리를 비롯해서 이공계가 아니더라도 데이터를 다룰 일들은 많은데, 파이썬을 쓸 줄 알면 상당한 도움이 된다. 수많은 파이썬 모듈이 나와 있어서 모듈만 잘 갖다 붙여도 별의 별 걸, 그것도 무척 쉽게 할 수 있다. 파이썬에서는 모듈을 관리하고 다운로드, 설치, 삭제할 수 있는 pip이라는 도구를 제공하고 있다. 큼직한 프로그램이나 엔터프라이즈급 서비스도 가능하며, 구글에서도 공식 프로그래밍 언어 중 하나로 쓰이고 있고 파이썬을 이용한 웹 서비스도 상당한 세를 형성하고 있다. 다만 프로그램 실행이 인터프리터 방식이다 보니 속도가 느리다는 문제점이 있기도 하고[5], GUI 환경의 데스크톱 프로그램이나 모바일 앱 개발 쪽으로는 아직 큰 인기는 끌지 못하고 있다.

파이썬이라는 이름은 귀도 판 로썸이 좋아하는 영국의 코미디 팀인 몬티 파이선(Monty Python)에서 따온 것이다. 그래서인지 파이썬을 다룬 책이나 문서에는 변수나 함수 이름으로 egg, spam, bacon 같은 이름이 많이 나온다. 왜 그런지는 스팸 (광고) 문서 참조.

우리나라에서는 웹 서버 사이드 프로그래밍 쪽으로는 인기가 그리 높지 않지만 해외에서는 상당히 많이 쓰이고 있다. 구글의 공식 언어 중 하나일 정도로 인정 받고 있으며 파이썬으로 돌리고 있는 웹 서비스들도 있고, 파이썬 Django프레임워크 기반으로 개발된 인스타그램은 가장 손꼽히는 활용 사례다.[6] 드롭박스는 일단 귀도 판 로섬이 근무했던 곳이기도 해서 파이썬 활용도가 높은 것으로 알려져 있다. 그밖에도 링크드인, 핀터레스트와 같은 대규모 웹 서비스들이 파이썬을 주축으로 혹은 일부 사용하고 있어서 대형 서비스에서도 충분히 활용할 수 있다. 파이썬은 Django프레임워크가 압도적으로 높은 사용률을 보이고 있고 좀 더 경량인 Flask도 상당한 사용자를 확보하고 있다. 최근에는 API 서버 기능에 주안점을 둔 웹 프레임워크인 FastAPI가 '느리다'는 파이썬의 이미지를 무색하게 할 정도로 빠른 속도로 주목을 받고 있지만 이쪽은 이름에서 알 수 있는 것처럼 API 기능에 특화된 것이라 범용성 면에서는 아직 장고나 플라스크에 많이 밀린다.

특징

기초 수준 영어에 친숙하다면 상당히 직관적이라는 것을 알 수 있다. 상당수 프로그래밍 언어들은 괄호나 중괄호를 비롯해서 이런저런 기호를 많이 쓰는 편인데 반해 파이썬은 영어와 비슷하게 보이는 자연어를 많이 활용하는 편이다. 예를 들어서 C++로 1부터 100까지 더한다고 가정해 보면,

int a = 0
for (int i = 0; i < 101; i++) {
  a += i;
}
count << a;

반면 파이썬은

a = 0
for x in range(0, 101):
  a += x
print(a)

프로그래밍 언어를 잘 모르는 사람에게 C++의 for 문은 정말 뭔지 알 수 없지만 파이썬은 어느 정도 추측이 가능하다. "x가 0부터 101에 이르는 범위(range) 안에 (in) 있는 동안"이라는 정도로 해석해 볼 수 있기 때문이다. 한국어로 해석해서 range와 in의 순서가 반대로 나와서 그렇지 영어에 친숙하다면 더욱 이해하기 쉽다. 이런 특징은 파이썬을 쉽게 배울 수 있는 이유 중 하나다.

언어의 구조

변수

파이썬은 약타입 언어로 변수는 C자바처럼 유형을 사전에 정의하고 엄격하게 지켜야 하는 방식이 아니다. 즉 자바스크립트베이직처럼 어떤 유형이든 변수에 대입할 수 있다. 변수를 정의 할 때에도 단순히 변수의 이름을 정하고 초깃값을 대입하는 것만으로도 충분하다. 다만 전역변수와 로컬변수 구분은 확실히 존재한다. 일단 값을 대입한 상태에서는 데이터 유형의 영향을 받기 때문에 문자열에 숫자를 더한다든가 하는 것은 안 되며[7] 반드시 타입 캐스트를 거쳐야 한다.

파이썬 3.5부터는 타입 힌팅(type hinting)이라는 기능이 들어갔다. 함수를 정의할 때 유형을 지정할 수 있지만 '힌팅'이라는 말처럼, 파이썬이 정적 유형 언어가 된 것은 아니다. 어디까지나 매개변수나 반환값의 '힌트'를 주는 것일 뿐이기 때문에 힌트에 어긋나는 유형의 데이터를 넘기는 코드를 작성했을 때 경고 메시지를 낼 지 말 지는 정해지지 않았다. 비주얼 스튜디오 코드의 파이썬 플러그인[8]은 v2021.9 버전 기준으로 경고를 내지 않는다. PyCharm은 경고 메시지를 낸다.

블록

코드의 실행 블록 범위를 정할 때 C자바를 비롯한 많은 언어들은 중괄호를 사용하거나, 파스칼처럼 endif와 같은 키워드를 사용해서 블록의 끝을 표시하는 것과는 달리 파이썬은 들여쓰기를 블록을 표시하는 방법으로 사용한다. 대부분 언어들은 들여쓰기를 시각적으로 블록을 구분하기 편하기 위해 쓰지만 파이썬은 의무이며 그렇지 않으면 오류를 일으킨다. 대신 중괄호나 endif를 사용하지 않으로 코드의 길이가 그만큼 줄어드는 장점이 있다.

들여쓰기를 할 때에는 탭을 사용하지 않도록 권장하며 보통 블록 1 단계 당 빈칸 2개 또는 4개를 사용하지만[9] 파이썬의 코드 스타일 가이드라인인 PEP-8에서는 빈칸 4개를 권장한다. 파이썬을 인식하는 코드 편집기는 이런 규칙을 알고 있기 때문에 탭을 눌러도 자동으로 스페이스로 전환해 준다. 블록을 이끄는 줄, 즉 루프 문이나 함수/클래스 정의문의 끝에는 쌍점(:)을 붙여서 블록이 시작한다는 것을 알린다. 파이썬을 인식하는 코드 편집기는 이러한 쌍점이 나온 다음 줄바꿈을 하면 자동으로 들여쓰기를 해 준다.

함수

함수의 정의는 자바스크립트와 같은 동적 타입 언어들과 별로 다르지 않다.

def add(x, y):
    return x + y

함수를 정의할 때에는 def 키워드를 사용하며 괄호 안에 매개변수의 목록을 써 주면 된다. 마지막으로 블록의 시작을 뜻하는 : 기호를 불여주고 함수의 내용은 들여쓰기를 해 준다.

파이썬의 특징 중 하나는 키워드 매개변수를 지원한다는 점이다. 함수를 호출할 때 매개변수는 나오는 순서에 따라서 지정되지만 키워드 매개변수를 사용하면 순서를 바꿀 수도 있다.

def divide(x, y):
    return x / y

z = divide(y=2, x=4)
print(z)

키워드 매개변수에는 몇 가지 제약이 있다. 함수를 호출할 때 매개변수는 순서 기준 매개변수가 우선이다. 키워드 매개변수는 순서 기준 매개변수가 다 나온 다음 나와야 한다. 또한 이미 순서 기준 매개변수로 나온 매개변수를 키워드 매개변수로 다시 지정할 수 없다. 예를 들어,

def divide(x, y):
    return x / y

z = divide(2, x=4)
print(z)

위 코드는 오류를 일으킨다. divide()를 호출할 때 첫 번째 매개변수인 2를 x로 간주하므로, x=4로 중복 지정할 수 없다.

함수의 정의를 보면 알겠지만 반환값의 유형을 지정하지 않으므로 같은 함수가 상황에 따라 다른 유형의 값을 돌려줄 수도 있다.

def divide(x, y):
    if y == 0:
        return 'The divider must not be zero.'
    else:
        return x / y

위 함수는 y가 0이면 문자열을 돌려주지만 0이 아니면 부동소수를 돌려준다. 하지만 이런 식으로는 하지 않는 게 좋다.

def divide(x, y):
    if y == 0:
        return 'The divider must not be zero.'
    else:
        return x / y

print(divide(4, 2) * 5)
print(divide(5, 0) * 5)

위 코드를 실행시키면 첫 번째 print() 함수는 '10'을 출력하지만 두 번째 print() 함수는 'The divider must not be zero.' 문자열을 다섯 번 반복해서 출력한다.

패키지

패키지 기능을 지원하는 대부분의 다른 언어들처럼 import 키워드로 패키지를 불러온다. 패키지에서 특정한 함수 또는 클래스만 가져 오려면 from [패키지] import [가져올 함수나 클래스 이름] 형식으로 가져오면 되며, 쉼표로 구분해서 같은 패키지에 속한 여러 함수/클래스를 한 번에 가져올 수도 있다.

패키지 관리자인 pip[10]이 있어서 이것으로 패키지를 다운로드, 업그레이드, 삭제할 수 있다. 단, 프로젝트 단위가 아니라 사용자 레벨로 깔리기 때문에 프로젝트별로 키워드를 관리하려면 venv와 같은 가상환경을 사용해야 한다.

개발 환경

파이썬을 설치하면 기본으로 제공하는 파이썬 쉘에 간단한 코드 정도는 직접 입력해서 실행시킬 수 있다. 개발환경인 IDLE[11]도 딸려오는데 간단한 편집기와 쉘, 간단한 디버거를 제공한다. 그리 복잡하지 않은 프로그램이라면 이걸로도 충분하고 일반 텍스트 편집기로 코드를 짜서 파이썬 쉘로 돌릴 수도 있다. 파이썬으로 만들었기 때문에 pip으로 설치할 수 있는 간편한 개발 환경인 Mu도 있다.

좀 더 좋은 기능을 원한다면 비주얼 스튜디오 코드와 같이 프로그래밍에 특화된 편집기도 있으며 플러그인 설치로 실행 및 디버그도 할 수 있다. 더 좋은 통합개발환경을 원하다면 제트브레인 사의 파이참(PyCharm)이 많이 쓰인다. 상용이지만 무료 버전인 커뮤니티 에디션만으로도 굉장히 좋은 편집 및 디버깅 기능을 마음껏 쓸 수 있다. 상용 버전은 장고 프레임워크 지원을 비롯해서 좀더 전문적인 개발을 위한 고급 기능들을 제공한다. 비주얼 스튜디오 커뮤니티 에디션 역시 파이썬 개발을 지원한다.

각주

  1. "IT열쇳말 : 파이썬", Bloter, 2016년 9월 22일.
  2. 이 타이틀을 처음으로 갖게 된 사람이 바로 귀도 판 로섬이다.
  3. "파이썬 창시자 귀도 반 로섬, BDFL 사임", ZDNet Korea, 2018년 7월 13일.
  4. 그런데 '자비로운 종신 독재자'라는 타이틀이 처음 붙은 사람이 바로 귀도 판 로섬이다.
  5. PyPy처럼 JIT 컴파일 방식을 사용한다든가 하는 시도들은 있지만 아직까지는 대세로 자리 잡지는 못하고 있다.
  6. 단, ORM을 비롯한 여러 부분을 마개조한 것으로 알려져 있다.
  7. 문자열에 숫자를 곱할 수는 있다. 숫자만큼 문자열을 반복한 문자열을 돌려준다.
  8. 마이크로소프트에서 제공하는 플러그인 기준.
  9. 요즈즘은 대부분의 프로그래밍 언어는 탭보다는 빈칸을 권장한다. 탭은 플랫폼이나 편집기의 설정에 따라 들여쓰기 칸수가 달라질 수 있지만 빈칸은 고정되어 있기 때문. 그런데 Go 언어는 2012년에 나온 언어인데도 옛날 언어처럼 탭을 권장한다. 하긴 Go 언어는 이런저런 면에서 상당히 올드한 면을 가지고 있긴 하다.
  10. 'PIP installs packages'를 줄인말로 재귀 약자다. 원래는 pyinstall이었다. 참고로 pip은 사과나 오렌지 같은 과일의 자잘한 씨, 또는 라디오에서 정각을 알릴 때 '삐~' 하는 소리를 뜻한다.
  11. 통합개발환경을 뜻하는 Integreted DeveLopment Environment에서 중간에 L자 하나를 더 끄집어내서 만든 이름. 몬티 파이선의 멤버인 에릭 아이들(Eric Idle)에서 따왔다는 게 정설.