Python
(♥ 0)
분류
[각주]
print("Hello, world!")
1. 개요[편집]
파이썬은 1991년에 귀도 반 로섬(Guido van Rossum)에 의해 만들어진 인터프리터 프로그래밍 언어이다. 직관적이고 쉬운 문법과 다양하고 풍부한 라이브러리들을 바탕으로 한 강력한 생태계를 가지고 있어 프로그래밍 교육, 인공지능, 데이터 분석 및 빅데이터, 백엔드, 프론트엔드, 웹 스크래핑 등 다양한 분야에서 사용되며, 이에 힘입어 2023 TIOBE 인덱스 기준 프로그래밍 언어 순위 1위이기도 하다.Life is short, you need Python.
인생은 짧기에, 당신에겐 파이썬이 필요하다.
파이썬 서문에 따르면 파이썬은 1989년 크리스마스에, 귀도가 취미 프로젝트로 시작하였다. 'Python'이라는 이름은 귀도가 즐겨 보던 영국의 6인조 코미디 그룹 몬티 파이썬에서 이름을 따왔다.
실행할 수 있는 의사 코드(Executable pseudocode)라고 불릴 정도로 문법이 단순하며 매우 미려하다. 때문에 초보자들이 프로그래밍을 할 때 많이 추천하는 언어이기도 하다. 그럼에도 사용률과 생산성, 실무에서의 사용성도 높기에 실무에서도 활발하게 사용되고 있다. 이는 APL이나 BASIC과 같은 교육용으로 사용되는 다른 언어들과의 차별점이기도 하다.
2. 디자인[편집]
2.1. 철학[편집]
파이썬의 디자인 철학은 PEP 20에서 잘 나타나 있다.
1. 아름다운 것이 추한 것보다 낫다. (Beautiful is better than ugly.)
1. 명시적인 것이 암시적인 것보다 낫다. (Explicit is better than implicit.)
1. 간결한 것이 복합적인 것보다 낫다. (Simple is better than complex.)
1. 복합적인 것이 복잡한 것보다 낫다. (Complex is better than complicated.)
1. 들여쓰기를 적게 하는 것이 깊은 것보다 낫다. (Flat is better than nested.)
1. 듬성듬성한 것이 밀집한 것보다 낫다. (Sparse is better than dense.)
1. 가독성은 중요하다. (Readability counts.)
1. 특별한 경우는 규칙을 어길 정도로 특별하지 않다. (Special cases aren't special enough to break the rules.)
1. 허나 실용성은 순수성을 이긴다. (Although practicality beats purity.)
1. 오류는 절대로 조용히 지나가지 않아야 한다. (Errors should never pass silently.)
1. 명시적으로 지나가는 것이 아니라면. (Unless explicitly silenced.)
1. 모호함을 마주쳤을 때, 이를 추측하려는 유혹을 거부하라. (In the face of ambiguity, refuse the temptation to guess.)
1. 명확한, 그리고 가급적이면 유일한 명백한 방법이 있을 것이다. (There should be one-\- and preferably only one -\-obvious way to do it.)
1. 그 방법이 처음에는 명확해 보이지 않을 수 있다.[2]
. (Although that way may not be obvious at first unless you're Dutch.)1. 그러나, 지금 행동에 옮기는 것이 아예 안 하는 것보다는 낫다. (Now is better than never.)
1. 아예 안 하는 것이 지금 *당장* 하는 것보다 나을 때도 많다. (Although never is often better than *right* now.)
1. 그러나, 구현 결과를 설명하기 쉽지 않다면, 당장 하는것은 좋지 않다. (If the implementation is hard to explain, it's a bad idea.)
1. 반대로, 구현 결과를 설명하기 쉽다면, 당장 하는 것은 좋을지도 모른다. (If the implementation is easy to explain, it may be a good idea.)
1. 네임스페이스를 사용하는 것은 완전 좋은 생각이다 -\- 더 많이 이용하자! (Namespaces are one honking great idea -- let's do more of those!)
특히 그중에서도 가장 유명한 것은 "명확한, 그리고 가급적이면 유일한 명백한 방법이 있을 것이다."라는 문장인데, 외부에는 '가장 아름다운 하나의 답이 존재한다'라고 파이썬을 표현하는 문장으로 잘못 알려져 있기도 하다.
잘못 알려진 문구는 PEP 584[3] 에 따르면 Perl 커뮤니티로부터의 모함에 불과하다고 한다. 실제로도 파이썬에는 한 가지를 여러 방법으로 처리하는 방법들이 있으며, PEP 584는 PEP 20에서 중요한 것은 obvious(명백한)라는 문구라고 해석한다. 즉, 같은 것을 하는 다른 방법이 있는지 여부 자체가 중요한 것이 아닌, 가장 명백한 방법이 존재한다면 파이썬의 정신에 위배되지 않는다는 것이다.[4]
파이썬의 디자인 철학에 맞는 코드를 짜는 것을 파이써닉(pythonic)이라고 부른다. 이는 단순히 스타일 가이드라인을 맞추는 것을 넘어, 파이썬의 파이썬에서 권장되는 다양한 클린 코드 기법을 통해 복잡하지 않고 의미가 명확하며, 명백하게 흐름이 보이는 PEP 20을 염두에 둔 코드를 작성하는 것을 말한다.
2.2. 들여쓰기 기반 코드 블록 처리[편집]
대부분의 다른 언어에서는 중괄호를 블록 단위로 사용하지만, 파이썬에서는 중괄호 대신 들여쓰기를 사용한다. 이 들여쓰기 문법은 시각적으로 파이썬과 다른 언어가 구분되는 특징이기도 하다. Lex Fridman과 진행된 귀도의 인터뷰에 따르면 공백은 가독성에 중요한 영향을 끼치며, 코드가 무슨 일을 하는지 알기 어렵게 되기 때문에 필수적이라고 하였다.
같은 인터뷰에서 귀도는 중괄호가 파이썬의 스타일이 될 수 있던 가능성이 있냐는 질문에 그렇다라고 답변하고 귀도는 오랫동안 들여쓰기 방식이 더 좋은 방식이라고 생각하고 지금도 문맥을 제외하면 들여쓰기 방식이 더 좋은 방식이라고 생각하지만 많은 다른 프로그래밍 언어들이 중괄호를 사용하는 지금의 상황에 비추어 보았을 때는 중괄호도 좋은 방법일 수 있다고 암시했다.
2.3. 순수 객체 지향[편집]
Python에는 원시 타입(Primitive Type)이 존재하지 않으며, 클래스, 함수를 비롯한 모든 것이 객체로 취급된다.
다만 이를 파이썬이 객체 지향만 지원한다고 오해하지는 않도록 유의해야 한다. 파이썬은 멀티 패러다임 언어로, 절차적 프로그래밍, 함수형 프로그래밍, 객체 지향 등 다양한 패러다임을 모두 지원하는 언어이다.
속도에서 약간의 희생되는 부분이 있었지만 덕분에 프로그래머는 더욱 편리하게 객체로서 정수를 비롯한 여러 타입들을 사용할 수 있다.
2.4. 변수 선언의 부재[편집]
파이썬은 여타 다른 언어들과 달리 변수 선언이 없다.
예를 들어 Rust는 다음과 같이 변수 선언을 해야 하지만
let mut hello = "world!";
파이썬의 경우에는 따로 선언을 하지 않는다.
hello = "world!"
이는 초보자들이 파이썬을 쉽게 접근하는 데에 도움이 되고, 변수 선언과 관련된 오류를 피할 수 있어 도움이 된다.
변수 재할당 금지하는 방법 역시 제공하지 않고, 작명 규칙이나 타입 힌트와 같은 것으로 사용자에게 상수라는 정보를 전달한다[5] .
from typing import Final
# 작명 규칙을 이용한 상수 표기
HELLO = "world!"
# 작명 규칙과 타입 힌트를 이용한 상수 표기
HELLO_WORLD: Final = "hello, world!"
# 상수 표기는 단순한 convention이기 때문에 재할당도 가능하다.
HELLO = 3
2.5. 느긋한 연산[편집]
느긋한 연산은 연산을 필요할 때까지 늦추고 필요할 때 계산이 되는 방식을 말한다. 파이썬에서는 range(), re.Match.finditer(),제너레이터 함수 등의 이터러블이나 이터레이터에서 쓰이고 있다.
제너레이터 함수의 예시는 다음과 같다.
# 제너레이터 함수
def get_multipe(number_to_muliply, limit=100):
for multiple in range(1, limit + 1):
yield number_to_muliply * multiple
multiple = get_multipe(2)
print(next(multiple)) # 결과: 2
print(next(multiple)) # 결과: 4
print(next(multiple)) # 결과: 6
...
print(next(multiple)) # 결과: 200
for multiple in get_multipe(3):
print(multiple, end=', ')
# 3, 6, 9, ... 300, 으로 출력됨.
이터레이터는 next(), 또는 for ... in 객체와 같은 문법들을 이용하여 순서대로 값을 호출할 수 있다.
이터레이터나 이터러블은 전부 리스트로 변환한 뒤 사용하는 것보다 조금 느릴 수는 있지만 메모리 효율적이다. 예를 들어 list(range(100))은 0부터 99까지의 모든 숫자를 담은 리스트를 모두 메모리에 담아야 하지만 range(100)은 0부터 99까지 모든 숫자가 있다는 정보만 담고 있기에 메모리에 전체 리스트를 담을 필요가 없다.
파이썬 2까지는 이터레이터를 사용하지 않는 경우가 있었다. 예를 들어 range()는 리스트를 반환했고 대신해 xrange()를 사용해야 했었다. 파이썬 3부터는 range()를 이터러블로 변경하면서 range()함수 안의 값이 얼마나 크던간에 메모리 효율적으로 사용할 수 있게 되었다.
2.6. 컴프리헨션[편집]
컴프리헨션은 다른 통상적인 언어들과 파이썬을 구분하는 파이썬의 특징적이면서도 유용한 기능이다.
컴프리헨션은 많이 사용되고 형태가 정형적이기에 많은 최적화가 들어가 있어 빠르다.
[f"{i:03d}" for i in range(100) if i % 3 == 0 or i % 2 == 0]
2.7. PEP[편집]
PEP(Python Enhancement Proposals, 파이썬 개선 제안서)란 파이썬 커뮤니티에 정보를 제공하거나, 파이썬이나 파이썬의 프로세스나 환경을 위한 새 기능을 설명하기 위한 내용을 담은 디자인 문서이다[6] . 모든 PEP 문서는 PEP 0에서 찾아볼 수 있고, 깃허브에서 소스 확인 가능하며, 각 문서의 끝에는 깃허브로 향하는 링크가 달려 있다.
PEP 8, PEP 20과 같이 자연수 번호를 붙이는데, 일반적으로는 글이 쓰여진 순서대로 붙지만, 파이썬 3와 관련된 글은 3000부터 순서대로 붙여지며, 거버넌스와 관련된 자료는 8000번부터 붙여지고, PEP 754나 PEP 801처럼 특별한 이유로 순서를 무시하고 번호가 붙여진 경우도 있다.
3. 장점[편집]
3.1. 신속한 개발 속도[편집]
파이썬의 아이덴티티. 높은 생산성은 그 무엇과도 비교할 수 없는 파이썬만의 특징이다. 쉬우면서도 다양한 패키지 생태계를 통한 범용성까지 갖춘 프로그래밍 언어는 찾기 힘들다.
인터프리터 언어이고 우수한 자료형과 다양한 모듈 등을 기본으로 제공해 개발 기간이 단축되는 것이 특징.
파이썬은 다른 언어와 함께 잘 작동하며, 이와 같은 특성 때문에 glue language라고 불리기도 한다. 예를 들어 C++로 구현되어 있지만 파이썬에서 사용할 수 있는 OpenCV나 C와 C++로 구현된 NumPy 등 다른 언어로 구현된 후 파이썬으로 사용할 수 있도록 만들어진 라이브러리는 파이썬 생태계에서 중요한 축을 담당한다. 이러한 패키지들은 파이썬의 높은 생산성의 장점은 그대로 가지면서 동시에 높은 속도까지 가질 수 있어 장점이 많다.
Traceback도 개발 속도에 한몫한다. 예전에 파이썬과 많이 비교가 되던 Perl 은 스택트레이스를 보여주지 않았기 때문이다. 반면 파이썬은 코드를 실수로 잘못 짠 곳이 있다면, 어떤 어떤 파일의 어떤 줄에서 어떤 함수에서 어떤 종류의 문제가 발생했는지 자세하게 알려준다. 꽤 많은 양의 메시지를 한꺼번에 보여주기 때문에 초보자에게는 당황스러울 수 있지만, 디버깅 시에는 정말 편리하다. 파이썬 이후에 나온 인터프리터 언어들은 스택트레이스와 오류 줄을 표시한다.
빠른 아이디어 구현이 생명인 데이터 과학 분야나 간단한 스크립트 및 자동화 분야에서 각광을 받고 있다.
동적 타입 언어이기에 성능이나 유지보수 면에서는 단점이 지적되고 있지만 대신 3.5버전부터 타입 힌트를 지원하며 유지보수 문제는 많이 해결되게 되었다.
3.2. 과학 및 공학 친화성[편집]
파이썬은 과학과 공학 분야에서 필요한 여러 기능을 기본적으로 제공한다. 정수의 크기에 제한이 없으며[8] , 또한 놀랍게도 복소수를 별도의 import까지도 필요없는 기본 타입으로 지원하며, 표준 라이브러리의 decimal, fractions 모듈을 사용해 소수점과 유리수를 정밀하게 다룰 수 있다. 이러한 기능을 다루는 암호학과 통계 분야에서 쓰기에 알맞다.
파이썬 생태계 또한 공학 및 과학 분야를 다양하게 지원한다. 복잡한 수치와 큰 데이터를 다루는 연산에 알맞은 NumPy, SciPy, pandas, 데이터를 그래프로 시각화하는 Matplotlib, 코드와 데이터를 함께 다룰 수 있는 Jupyter Notebook 등의 강력한 패키지와 도구들을 무료로 사용할 수 있다. 이 점 때문에 막대한 라이센스 비용을 지불해야 하는 MATLAB과 기타 과학 프로그램들의 많은 사용자들이 파이썬으로 넘어오게 되었고, 이는 파이썬이 풍부한 개발자 풀을 지니게 되는 단초가 되기도 하였다.
언어 개발자들도 이러한 사실을 잘 알고 있기 때문에 언어 차원에서 관련 패키지를 위한 기능을 제공하기도 한다. 행렬곱(@) 연산자가 대표적인 예인데, 파이썬 stdlib에서는 사용하지 않지만 NumPy 등에서 자주 사용된다는 이유로 추가될 수 있었다. 자세한 내용은 PEP 465에 잘 설명되어 있다. 해당 문서에 따르면 NumPy는 math 모듈보다도 1.5배 가량 더 사용되고, 비트 연산자들에 비해 행렬곱이 더 잘 사용된다고 설명한다.
3.3. 거대한 생태계[편집]
파이썬은 매우 거대한 생태계를 가지고 있기에 자신이 원하는 것이 있을 때 관련된 패키지나 코드를 찾기에 매우 용이하다.
수학, 공학 및 통계학부터 시작해서 자동화, 벡엔드, 머신러닝, 게임 등 다양한 목적의 패키지가 있다. 자세한 내용은 '주요 패키지' 항목 참고.
3.4. 쉬운 난이도 및 교육의 편의성[편집]
파이썬은 주요 언어 중 가장 초보자 친화적인 특성이 강하기 때문에, 교육용 프로그래밍 언어로 각광받고 있다. 현재 세계 유수의 대학교들은 프로그래밍 개론에서 쓰이는 언어를 C, C++나 Java에서 파이썬으로 바꾸었다.
대한민국의 대학교 중 서울대, 충남대, 포항공대나 고려대와 같은 곳에서도 파이썬을 사용해 프로그래밍을 가르치고 있다.
다만 프로그래밍 자체를 배우기 위해서는 파이썬만으로는 부족하거나 혹은 파이썬을 아주 깊이 파야 한다. 후자의 경우 객체지향은 최소 데코레이터를 알아야 하고, 제대로 쓰기 위해서는 메타클래스 개념까지 알아야 한다. 얕은복사와 깊은복사를 구분하지 못하면 로우레벨의 관점도 알 수 없다. 결정적으로 동적 언어이기에 차후 정적 언어로 넘어가기가 어렵다.[9] 이러한 문제점들로 인해 파이썬 자체가 코딩의 입문에는 좋지만 프로그래밍 개념의 입문으로는 적절하지 않다는 비판이 상당히 많이 존재한다. 파이썬은 수많은 프로그래밍 언어 중 하나일 뿐이며, 프로그래머라면 언어는 도구로 사용되어야지 목표로 사용되어서는 안 되기 때문이다.
4. 단점[편집]
4.1. 배포(distribution)[편집]
파이썬은 배포를 하는 과정이 복잡하고 파편화되어 있다. 파이썬의 경우 인터프리터 언어이기 때문에 실행하려면 무조건 파이썬이 설치된 환경을 만들어야 하고, 그 과정에서 환경 변수 설정이나 개발 환경 설치를 요구하기도 한다. 파이썬 설치 또한 쉽지 않은데, 운영 체제가 무엇인지에 따라 설치 방법이나 주의해야 할 점 등이 모두 다르다. 이러한 단점은 인터프리터가 필요한 언어들에서는 공통적으로 나타나는 특징이기는 하나[10] , 파이썬의 경우 사용자층이 매우 다양하고 개발자가 아닌 경우도 매우 많기 때문에 이러한 문제들이 더욱 부각된다.
이런 설치 과정을 줄이는 방식 중 하나로 py2exe, Pyinstaller, cx_Freeze와 같이 파이썬 자체와 사용된 패키지 모두를 하나의 exe로 묶는 방식이 사용되고 있다. 하지만 공식 지원이 아닌 써드 파티 패키지[11] 이기 때문에 일부 패키지들과 호환되지 않는 문제가 발생할 수 있고, 특히 용량이 기존 파일에 비해 매우 커지는 문제가 있는데, 간단한 Hello, world! 프로그램을 C언어를 이용해 exe파일을 만들면 약 0.25 MB에 불과하지만, 파이썬과 Pyinstaller를 이용해 exe파일을 만들면 약 5.8 MB 용량의 파일이 만들어진다.
프로그램 사용자뿐 아니라 개발자에게도 파이썬 배포는 골치 아픈 작업인데, 패키징이 파이썬과 같이 만들어진 것이 아닌, 중간에 개발된 것이기 때문에 애드혹이 많고 파편화되어 있다. 최근에는 pyproject.toml로 모든 설정을 몰고 Poetry와 같은 패키지를 사용하며 해결될 수 있지만 여전히 이전에 만든 튜토리얼들이 돌아다니고 초보 개발자가 하기에는 상당히 어려운 과정이다.
아이러니한 점은, 파이썬이 프로그래머들에게 쓰기 편하기 때문에 Make 등의 패키지/프로젝트 관리용 스크립트로도 많이 사용된다. 즉 파이썬 자체는 패키징 도구가 난잡한데, 정작 다른 프로그램을 패키징할 때는 파이썬이 유용한 도구로 많이 쓰인다는 것.
최근에는 아예 Python을 컴파일해서 네이티브 실행파일로 만드는 것도 주목받는다. 대표적으로 Nuitka, LPython, GraalPy과 같은 경우가 이런 시도들이다.
4.2. 속도[편집]
파이썬의 가장 큰 단점으로 꼽히는 것은 속도이다. 한 논문에 따르면, CLBG에서 제시한 10개의 벤치마킹을 돌려본 결과 파이썬은 C에 비해 71.90배의 시간, 2.80배의 메모리, 75.88배의 에너지를 더 소모한다고 한다.
겉보기에는 큰 문제처럼 보이지만 생각보다 큰 문제가 되지 않는데, 파이썬의 직관적인 문법 덕분에 개발 속도가 매우 크게 단축이 되고, 극단적으로 1ms 돌아갈 프로그램이 100ms에 돌아간다고 해도 많은 경우 문제가 되지 않기 때문이다. 또한 NumPy나 C, C++, Rust 등 더 빠른 언어를 뒤에서 사용하는 라이브러리들의 경우 순수 파이썬 구현이 아니기 때문에 빠른 언어와 비교 시 실행 속도에 별다른 영향을 미치지 못한다.
머신 러닝 라이브러리들이 대표적인데, 머신 러닝 라이브러리인 TensorFlow나 PyTorch는 C++으로 제작되었고, GPU 가속을 이용할 경우에는 GPU의 속도에 영향을 받지 파이썬을 활용하지 않기에 파이썬의 속도와는 큰 관련이 없다.
이처럼 파이썬은 사실 다른 언어에 비해 많이 느리기 때문에 프로그래밍 대회에서 실행시간 제한 때문에 어려움을 겪기도 한다. 코딩 테스트에서는 일반적으로 외부 라이브러리를 사용하지 못하게 하지만 일부 코딩 테스트에서는 NumPy와 같은 외부 라이브러리를 사용할 수 있도록 한다. 예를 들어 LeetCode는 NumPy를 사용할 수 있도록 허용하지만 백준은 NumPy를 허용하지 않는다.
이는 병렬 처리를 통해 개선할 수 있지만 후술할 GIL 때문에 멀티쓰레딩의 경우 여전히 제약이 존재한다.
느린 속도를 체감할 수 있는 경우는 코딩 테스트 때나 많은 계산을 요구하는 경우이다. 반대로 네트워크를 사용하거나 파일 입출력이 많은 경우에는 파이썬과 다른 언어의 차이가 그리 크지 않다. 이를 io bounded task라고 부르는데, io를 사용하기 위해 기다리는 시간이 대부분이기 때문에 네트워크나 파일 입출력의 속도가 중요하지 파이썬의 성능이 크게 눈에 띄지는 않는다. 또한 많은 계산을 요구하는 경우 외부 라이브러리를 통해 상당한 폭으로 개선이 가능하다.
CPython 개발자들도 이를 인지하고 있으며 faster-cpython 프로젝트 등을 통해 속도를 크게 향상시키고 있다. 특히 CPython 개발자들과 함께 귀도가 재직 중인 마이크로소프트와 장고를 사용하고 있는 인스타그램 등의 회사에서 CPython 속도 향상에 많은 기여를 하고 있다. 이 프로젝트의 결과는 Python 3.11에서 가시화되었는데, 일반적으로 20%, 최대 60%까지의 성능 향상을 이루어 내었다. 대부분의 머신러닝 라이브러리에서 3.11 버전을 지원하는 2024년 부터는 머신러닝 계열에서 상당한 속도 향상이 기대된다.
4.2.1. 속도 향상 방법[편집]
이러한 파이썬의 느린 속도를 보완하기 위해 다음과 같은 여러 가지 방법이 사용된다.
4.2.1.1. 반복문 피하기[편집]
우선 파이썬의 기본 내장 모듈 중 일부는 로우 레벨로 구현되어 있고 만약 해당 모듈을 사용할 수 있다면 더욱 빨라질 수 있다는 점을 알아야 한다.
예를 들어 다음과 같은 코드는 비효율적이지만,
# 비효율적인 프로그래밍의 예시
sum_result = 0
for i in range(1, 10001):
sum_result += i
# 1부터 10000까지 모두 더한 값인 50005000이 나옴.
print(sum_result)
sum을 이용한 다음의 코드는 효율적이며, 더 깔끔하다. sum은 파이썬이 아닌 C언어로 구현되어 있기 때문이다.
# 효율적인 프로그래밍의 예시
# 1부터 10000까지 모두 더한 값인 50005000이 나옴.
print(sum(range(1, 10001)))
4.2.1.2. C 바인딩된 외부 라이브러리 사용하기[편집]
Numpy, Numba, TensorFlow 등의 라이브러리는 내부적으로 C나 C++로 개발되어 있고, 파이썬을 사용하는 것보다 더욱 빠른 속도를 기대할 수 있다. 예를 들어 NumPy을 사용하면 C에 필적하는 속도를 낼 수 있다.
4.2.1.3. 비동기 IO 사용하기[편집]
파이썬 3.4 버전부터는 F#에서 영향을 받아 표준 라이브러리의 각종 파일 입출력, subprocess, socket 통신 등의 기능들을 비동기 패러다임으로 이용할 수 있는 asyncio 패키지가 포함되었다. 파이썬 3.5 부터는 async, await 키워드가 포함되어 asyncio 라이브러리에 의존할 수밖에 없던 비동기 IO 기능을 다른 서드파티 라이브러리도 보다 쉽게 지원할 수 있도록 바뀌고, 비동기 처리 내부에서의 예외 처리 과정이 개선되었다.
4.2.1.4. 다른 구현체 사용하기[편집]
CPython 외의 여러 다른 구현체들을 통해 이 문제를 해결할 수도 있다. JIT을 사용하는 PyPy, LLVM으로 컴파일되는 GraalPy, Codon, GIL이 없는 Jython, 혹은 구현체는 아니지만 LLVM 컴파일을 이용하는 Numba와 LPython, Nuitka 등을 사용할 수 있다.
파이썬의 슈퍼셋을 자처하지만 자체 문법은 전혀 딴판인 Mojo와는 달리 Nim은 문법은 파이썬과 매우 유사하지만 파이썬과 서로 모듈 호환은 되지 않는데, 그래도 익숙한 파이썬의 문법을 가지고 코딩을 할 수 있다는 장점이 있다.
4.3. GIL[편집]
GIL(Global Interpreter Lock)은 파이썬의 성능에 대한 이야기를 할 때 빼놓을 수 없다.
CPython에서는 GIL을 이용해 여러 쓰레드를 만들더라도 GIL에 의해 동시에 한 바이트코드만 실행되도록 제한한다.
기본적으로 GIL이 구현된 이유는 reference counting 때문인데, 그 외에도 구현이 수월해지고 굉장히 이해하기 어려운 동시성 관련 버그가 일어나는 것을 막을 수 있으며 race condition을 효과적으로 방지하고, IO가 주가 되는 작업은 GIL의 유무에 따른 유의미한 성능 차이가 없다는 장점이 있었다. 또한 오히려 GIL이 없다면 싱글 쓰레드 프로그램에서는 불필요한 쓰레드 관련 작업이 추가로 들어가야 하기에 더욱 속도가 느려진다는 점도 GIL을 계속해서 사용하는 이유가 되었다. 특히 파이썬이 멀티쓰레딩을 구현한 당시에는 멀티코어 CPU가 흔하지 않았다는 점도 중요한 이유였다.
하지만 다중 코어 CPU가 보편화된 지금에 이르러서는 다중 코어를 제대로 활용하지 못하게 되는 원인이 되면서 파이썬의 성능을 제한하는 가장 큰 원인으로 지적되고 있다.
파이썬 커뮤니티는 이 문제를 피하기 위해 다양한 방법을 사용해 왔다. 일부 C 라이브러리(Numpy, Scipy, Numba)는 GIL을 우회하는 방법을 제공하기에 관련 모듈을 사용하거나, 멀티프로세싱을 사용하거나, 계산량이 많은 부분은 C와 같은 성능이 좋은 언어로 구현하는 등 다양한 방법을 사용했다. Jython같은 일부 구현체는 GIL이 없기도 하다. 하지만 근본적인 해결책이 아닌 우회적인 방법이고, 매우 성가시다는 단점이 있다.
따라서 GIL을 없애자는 논의는 지속되어 왔고, 파이썬 3.13에서는 GIL을 선택적으로 만들고, 장기적으로는 GIL을 파이썬에서 완전히 제거하는 방향으로 결정되었다.[12] 따라서 미래에는 GIL과 관련된 성능적 제약 문제가 다수 해결될 것으로 보인다.
5. 구현체 목록[편집]
"display: none; display: 문단=inline"를 참고하십시오.
6. 개발 환경[편집]
6.1. 개발 도구[편집]
- Visual Studio Code(약칭 VSCode)
- PyCharm
- Jupyter Notebook 혹은 JupyterLab
- replit
- IPython
- IDLE (기본 탑재)
- REPL (기본 탑재)
파이썬을 설치하면 "python", "python3(POSIX 계열 한정)" 혹은 "py(윈도우 한정)"라는 명령을 통해 기본적으로 repl[13] 을 사용할 수 있다. 이는 계산기로 사용하거나 한두 줄짜리 간단한 프로그래밍을 하기에는 적합할지 모르지만 서너 줄만 넘어가도 사용하기에 조금 불편하며 값이 저장되는 것이 아니기에 사용하기에 좋지는 않다.
저사양 노트북이라면 IDLE를 사용하는 것도 고려할 만 하다. IDLE은 파이썬에 기본 탑재되는 코드 편집기로 REPL과 달리 .py 파일을 편집할 수 있도록 하는 기능도 있고 힌트 등도 지원한다. 하지만 아래에 소개될 다른 코드 편집기들에 비해서는 기능이 압도적으로 부족하기에 일반적으로는 다른 편집기를 추천하는 편이다.
IPython은 파이썬의 기본 REPL보다 진보된 REPL이다. 기본 REPL과 마찬가지로 결과가 저장되지 않고 간단한 계산에 이용하기 좋은 정도이지만 만약 REPL을 사용해야 할 일이 있다면 IPython을 이용하는 것이 더 좋다.
Jupyter Notebook은 REPL을 파일 형식으로 만든 것이라고 보면 좋다. 특이점은 웹 브라우저에서 실행된다는 점이다. %load_ext 명령어를 통해 다양한 확장 프로그램도 이용할 수 있다. PyCharm 유료 버전이나 VSCode에서도 사용할 수 있도록 지원해서 만약 VSCode나 PyCharm을 이미 사용하고 있다면 웹 브라우저에서 사용하는 대신 자신이 선호하는 IDE에서도 직접 사용이 가능하다. 온라인에서 파이썬 실행을 할 때 사용할 수 있는 Colab도 Jupyter 기반이다.
VSCode[14] 와 PyCharm은 IDE(Integrated Development Environment)로, 터미널, 디버거, 확장(Extension), 코드 편집기 등 개발에 도움을 주는 각종 기능들이 담겨 있는 앱이다. IDE는 작업 중인 코드 상의 문제를 추적해 주거나 스타일 수정을 해 주는 패키지와의 연동을 통해 GUI 상에서 코드 퀄리티 관리를 자동으로 해 주는 편리한 기능도 제공한다.
PyCharm은 JetBrains 계열 IDE로 파이썬에 대한 IDE이다. 사유 소프트웨어이고 Jupyter Notebook 실행 등 일부 기능은 유료 버전에서만 사용 가능하기는 하지만 파이썬 분야에서 VSCode와 함께 가장 많이 사용되는 IDE이기도 하다.
VSCode는 자유 오픈 소스 소프트웨어이고 모든 기본 기능이 무료이며 다양한 확장 프로그램도 사용할 수 있다. 파이썬 외에도 여러 다른 언어들까지 확장 프로그램을 설치하면 한 에디터로 처리할 수 있다는 점도 장점으로 꼽힌다.
이 외에도 아나콘다에 기본 탑재된 Spyder나 Visual Studio, Sublime Text, Notepad++ 등 다양한 개발 도구로도 파이썬 개발이 가능하다.
6.2. 패키지 관리[편집]
파이썬의 라이브러리 개발 방식은 세월이 흐름에 따라 여러 차례 바뀌었다.
패키지 관리자라는 개념이 없어서 각자 프로그램의 소스 코드를 다운로드해 쓰던 시절에는 setup.py라는 설치 스크립트를 각자 만들어서 파이썬 프로그램과 함께 배포하는 것이 관행이었다. 복잡한 설치 스크립트가 필요한 이유는 여러 OS 간의 호환성 문제를 해결하기 위함도 있지만, C와 C++ 코드를 함께 사용한 라이브러리를 배포하기 위함이다. 이러한 언어는 해당 OS에 맞게 컴파일해야 하는데, 수많은 OS에 맞춰 컴파일하는 것은 문제가 있었다.
이를 언어 차원에서 지원하기 위해 파이썬 1.6부터는 distutils라는 빌드 도구를 기본 탑재하였다. 그런데 distutils는 의존성을 설치하지 못해서 직접 일일이 설치해야 한다는 치명적인 문제가 있었다. 이를 해결하기 위해 setuptools라는 도구가 등장하였다.
이후 setup.py를 만드는 기존의 방식의 단점이 부각되었다. setup.py를 실행하는 데 필요한 도구[15] 가 있는지 확인하고, 없으면 자동으로 설치하거나 사용자에게 알려주는 기능이 없으며 임의의 파이썬 코드이기에 작성하기 때문에 패키지 이름이나 버전과 같은 메타데이터를 추출하는 것이 까다로우며 악의적인 코드를 심을 수 있고, setuptools를 직접 import하기 때문에 사용자가 다른 빌드 도구를 선택할 수 없다는 단점이 있었다.
이 때문에 setup.py를 작성하는 대신 pyproject.toml이라는 설정 파일을 사용하는 표준안인 PEP-518이 등장하였다. pip는 버전 10.0부터 pyproject.toml을 지원했고, 현재는 파이썬 표준 방식으로 자리잡고 있다.
6.2.1. PyPI[편집]
파이썬의 공식 패키지 저장소로, Python package index의 줄임말이다. 2012년 파이썬 소프트웨어 재단에 의해 구축되었다. 2021년 11월 기준 34만여 개의 패키지를 제공한다. 아래와 같이 파이썬 패키지를 간단히 설치할 수 있다.
pip install package
그러나 PyPI의 기본 명령어인 pip를 사용할 경우, 기본적으로 패키지를 모두 한곳에 설치하기 때문에 시스템에 내장된 파이썬에 영향을 주며, 프로젝트를 여러 개 관리할 경우 호환성 문제가 생긴다. 따라서 일반적으로는 Poetry, Pipenv와 같이 가상 환경을 격리시켜 주는 도구와 함께 사용하는 것이 좋다.
poetry add package
PyPI는 유료로 패키지를 구매하거나 프로젝트 코드를 볼 수 없도록 하는 기능을 전혀 지원하지 않는다. 이 부분은 오픈소스 생태계에서 아주 유리하게 작용했는데, 누군가 만들다 중단된 프로젝트를 포크(Fork)해서 프로젝트를 이어가거나 기존 코드를 들여다보고서 그 패키지에 대한 확장 기능을 어렵지 않게 개발할 수 있었기 때문이다.
6.2.2. Anaconda[편집]
사설 패키지 저장소 겸 가상환경 관리 프로그램으로, 공학/과학 응용 분야에서 매우 널리 사용되며 일반 사용자에게는 무료이다.[16] `conda`라는 명령줄 프로그램을 제공하며, 이는 별도의 가상환경 생성 및 관리 기능을 가지고 있고 같은 명령어로 해당 가상환경에 패키지를 설치할 수 있다. 파이썬 패키지만 지원하는 PyPI와 달리 blas, cuda, boost 등의 패키지 또한 등록되어 있어 anaconda에서 관리하는 가상환경에 설치할 수 있다.
편리하고 공식적인 PyPI를 사용하지 왜 굳이 이런 사설 패키지 저장소를 사용하냐고 궁금해할 수도 있는데, 이는 의존성(Dependency) 관리 때문이다. PyPI는 의존성 충족 여부를 단순히 패키지별로 확인하며, 두 패키지의 의존성이 충돌되는 경우를 막아주지 않는다. 그러나 conda의 경우 의존성 트리를 철저하게 확인하여 그러한 의존성 모순이 없도록 강제한다. 따라서 의존성 관계가 복잡한 경우 conda를 사용하여 관리하는 것이 편리하다.
또한 상술한 바와 같이 파이썬 패키지 외의 다른 언어로 작성된 패키지도 설치가 가능하며[17] , 이들 또한 위의 의존성 관리에 포함된다. 따라서 시스템에 설치되어 있는 패키지의 버전이 설치하고자 하는 라이브러리와 호환되지 않거나, 보안상의 이유로 시스템에 패키지를 추가 설치하기 어려운 경우 사용할 수 있다.[18] 이와 같은 이유로 의존성이 복잡한 몇몇 패키지들은 anaconda를 사용하여 설치하는 것을 권장하는 경우가 있다.
수학/과학/공학 업무에 필요한 NumPy, SciPy, Jupyter Notebook 등의 수백 개의 패키지와 도구를 한 번에 깔아줄 뿐만 아니라 GUI도 제공하는 Anaconda와, 코어 기능인 패키지 매니저 및 가상환경 관리자만을 제공하는 Miniconda가 있다. 다만 Anaconda는 설치에 시간이 오래 걸리고, 어차피 몇백 개나 되는 패키지를 다 쓸 일은 잘 없기 때문에 Conda 사용에 숙련되면 Miniconda를 쓰는 것도 좋다. Miniconda는 패키지를 자신이 직접 찾아서 깔아야 하지만, 어차피 필요한 패키지를 설치하는 것은 install <패키지명> 몇 번만 두드려 보면 간단히 해결된다.
conda install package
각종 파이썬 라이브러리를 설치하고 관리하는 도구이다. 몇몇 파이썬 라이브러리는 리눅스의 패키지 관리자로도 설치할 수 있지만, 이는 시스템의 파이썬을 건드리므로 일반적으로는 권장되지 않는다. 쓸데없는 라이브러리들이 함께 설치되거나 패키지 의존 관계가 꼬이는 것을 막으려면 하나의 패키지 관리자만 이용하는 것이 좋다. 단, Conda에는 등록되지 않아서 PyPI으로만 설치할 수 있는 패키지는 어쩔 수 없이 PyPI을 사용해야 한다. 그리고 PyPI로 설치할 수 없는 시스템 의존성(Dependency)이 있으면 Conda로 설치해야 한다.
리눅스와 같이 자체적으로 파이썬을 탑재한 운영체제에서는 호환성 문제를 특히 신경 써야 한다. 시스템에 내장된 핵심 도구들이 기본적으로 설치된 파이썬 라이브러리를 사용하기 때문이다. 만약 패키지를 설치하다가 호환성 문제가 생기면 최악의 경우 OS를 재설치해야 할 수 있다. 따라서 이런 OS에서는 시스템 내장 파이썬에 패키지를 설치하면 안 되며, 대신 install --user로 사용자별 기본 환경에 설치하거나 별도의 가상 환경을 만들어야 한다.
6.3. 가상 환경[편집]
한 컴퓨터 내에서 여러가지 프로젝트를 작업할 때, 필요한 버전이 다른 경우 프로젝트가 꼬일 가능성이 있는데, 이런 때를 위해 필요한 것이 바로 가상환경이다. 가상 환경 디렉토리 이름은 사용자 마음대로 정할 수 있지만,
.venv
로 작명하는 것이 일반적이다.VSCode 같은 일부 IDE에서는 가상환경이 감지될 경우 폴더 내의 해당 가상환경을 자동으로 잡아서 실행해준다.
파이썬 3.3부터 추가된 가상 환경 관리 내장 모듈이다. 내장이기에 파이썬만 설치하면
python -m venv <가상환경 이름>
라는 단 한 줄의 명령만으로 매우 간편하게 사용이 가능하다. 가상환경 설치 후 < 가상 환경 이름 >/bin/activate
을 실행하면 가상환경이 실행된다. 가상환경 실행 중 deactive
라는 명령으로 바로 가상환경을 종료할 수 있다.- virtualenv
virtualenv my-venv
# 특정 파이썬 버전으로 된 환경을 구성하려는 경우에는...
virtualenv my-venv --python=<특정 버전>
- conda
conda create --name my-venv
# 특정 파이썬 버전으로 된 환경을 구성하려는 경우에는...
conda create --name my-venv --python=<특정 버전>
7. 주요 패키지[편집]
패키지 중에서는 NumPy나 Pandas와 같이 파이썬과는 약간 다른 방식으로 코드를 운용해야 하는 경우가 있다. 파이썬을 접하고 배우다가 이런 패키지들을 처음 활용하게 될 때에는 살짝 어색하거나 어려울 수 있지만 계속해서 사용하다 보면 곧 익숙해질 수 있다.
- 수학, 공학 및 통계학: NumPy, SciPy, SymPy, Pandas, 다스크
- 그래프: matplotlib, Seaborn, PyQtGraph, Bokeh, Plotly, Pygal
- 엑셀 자동화, 파일 처리 자동화, 웹 크롤링/스크래핑 등 자동화 프로그램
- 동기형(WSGI) 웹 프레임워크: Django, Flask, Bottlepy
- 비동기형(ASGI) 웹 프레임워크: Uvicorn, Starlette, FastAPI
- 머신 러닝/딥러닝: scikit-learn, TensorFlow, 파이토치, Keras, Jax
- 컴퓨터 비전: OpenCV
- 프론트엔드/GUI: tkinter, PyQt, PySide, wxPython, PyGTK
- 게임: Pygame, 렌파이(비주얼 노벨)
- VFX 프로그램을 비롯한 다양한 개발 툴의 스크립트 언어
- 크로스 플랫폼 앱: Kivy, Beeware
- 데이터베이스와 SQL: sqlite, pymongo, SQLAlchemy
- 파이썬 고속/병렬화/컴파일 지원: Numba
- BeautifulSoup: XML, HTML 파싱을 쉽게 할 수 있는 라이브러리이다.
- dateutil: 복잡한 날짜 및 시간 형식을 다루는 라이브러리이다. 표준 라이브러리에 포함된 datetime만으로 해결하기 어려운 날짜/시간 문자열 처리나 국제 시간에 관련된 기능을 제공한다.
- 셀레니움(Selenium): 웹 페이지 조작과 크롤링
- 필로우(Pillow): PIL은 개발이 예전에 중지되었고, PIL의 포크(fork)인 Pillow가 그 역할을 대신하고 있다. Pillow를 쓰자. PIL은 Python Imaging Library의 머릿글자로 간편한 이미지 처리를 위한 라이브러리이다.
- PyYAML: YAML 형식의 파일을 읽고 쓰기 위해 사용하는 라이브러리이다.
- requests: HTTP 요청을 보낼 때 사용하는 라이브러리이다. 표준 라이브러리에 내장된 urllib 모듈에 비해 사용이 편리하고 기능이 뛰어나다.
- tossi: 야생의 땅: 듀랑고를 개발한 왓 스튜디오에서 개발한 한국어 조사 처리 라이브러리. 같은 인물이 만든 korean 모듈을 대체했다.
- argparser 터미널에서 명령어 parser 지원
- Pygame - Python으로 비디오 게임을 제작하기 위한 프레임워크이다.
- 스크래피(Scrapy): 웹 스크래핑 및 크롤링을 쉽게 할 수 있도록 만들어진 패키지이다.
7.1. 코드 퀄리티 관리[편집]
한 줄의 길이나 문자열을 감싸는 따옴표(
""
/''
) 등 사람마다 스타일이 다를 수 있는 부분은 많다. 따라서 코딩 스타일을 통일하는 도구를 사용하면 여러 사람이 협업하면서 생기는 코드의 가독성이나 일관성 문제를 개선할 수 있다.포매터는 짜여진 코드를 가독성이나 일관성에 합치되도록 수정해주는 도구이다.
린터는 스타일 기준에 맞지 않는 스타일이나 바람직하지 않은 코드를 잡아낼 수 있는 편리한 기능을 제공하는 도구이다.
정적 타입 검사기는 동적 언어라서 변수의 자료형을 따로 체크하지 않는 파이썬을 위해, 코드를 직접 분석하여 변수를 올바른 용도로 사용하는지, 특정 함수에 올바른 값을 전달하는지와 같은 정보를 검사한다. 코드를 모두 분석한 후 컴파일하는 TypeScript와 달리 파이썬은 type hint가 있지만 정적 타입 검사에 실패하더라도 코드 실행은 된다
이 중 유명한 패키지들은 설치하고 나면 Visual Studio Code나 PyCharm과 같은 편집기에서 아예 에디터와의 연동을 통해 눈으로 코드의 상황을 볼 수 있도록 표시해 주는 기능을 사용할 수 있다.
- 포매터
- ruff: Rust로 제작된 린터이자 포매터로, 지금까지 코드 퀄리티 관리 툴들에 비해 비교가 힘들 정도로 매우 빠르면서도 Flake8, isort, pydocstyle, autoflake, Black 등 기존의 툴들과 호환되기에 큰 인기를 얻고 있다.
- Black: The Uncompromising Code Formatter(타협하지 않는 코드 포매터)라는 표어에서 나타나듯이, 다른 포매터에 비해 사용자가 설정할 수 있는 옵션이 매우 적은 것이 특징이다. 내가 원하는 코드 스타일이 아니라 Black이 강요하는 스타일을 따라가야 한다는 단점이 있지만, Black으로 처리한 코드는 누가 쓰든 비슷하기 때문에 일관성은 매우 뛰어나다. 개발자가 신경 써야 할 것을 최소화한다는 점 덕분에 후발 주자임에도 빠르게 인기를 얻었다. 어떤 식으로 코드를 자동으로 수정하는지는 여기에서 체험해 볼 수 있다.
- isort: import 문을 일관성 있게 정렬해 준다.
- autopep8: 파이썬 공식 스타일 가이드인 PEP 8에 맞게 코드를 고쳐준다.
- yapf: 구글에서 개발한 스타일 검사 도구.
- 린터
- 정적 타입 검사기
7.2. 확장 모듈[편집]
영어로는 Extension Module이라고 한다. 확장 모듈은 C언어를 통해 파이썬의 실행 속도를 극적으로 향상시킬 수 있는 방법을 제공해 준다. CPython API (Python.h)를 통해 C로 작성되므로 CPython 구현체에 의존하는데, CPython은 C로 작성된 확장 모듈을 통해 파이썬에 내장된 함수나 객체처럼 사용할 수 있는 기능을 제공하기 때문이다. 구체적인 방법은 공식 문서에 나와 있다.
확장 모듈을 직접 작성하기 위해서는 C언어와 CPython API에 대한 상당한 지식이 요구된다. 그 예시가 궁굼하다면 numpy의 다차원 배열 소스 코드를 참고하자. 확장 모듈을 더 편하게 작성하기 위해서 아래에 서술된 패키지들을 사용할 수 있다.
다만 단순히 C로 작성된 라이브러리를 사용하는 것이 목적이라면 PyPy에서도 사용이 가능하고 호환성이 좋은 FFI를 사용하는 것이 더 바람직하다.
- Cython: 싸이썬이라고 읽는다. 기존 파이썬 코드와 비슷한 문법으로 컴파일 과정을 통해 빠르게 실행할 수 있는 CPython용 확장 모듈을 제작하기 위한 패키지다. CPython의 속도를 높이고자 아예 C언어로 변환하여 컴파일하는 방법을 사용한다. 파이썬의 문법을 확장하여 정적 타입 선언 기능을 넣어, 기존의 C 코드를 쉽게 접착할 수 있도록 만들었다. CPython C API를 이용하여 C 코드를 직접 접착하는 기존의 방식보다 훨씬 사용하기 쉽고, C언어로 변환되어 컴파일된다는 점 때문에 ctypes의 오버헤드 없이 C와 호환되는 라이브러리를 직접 사용할 수 있다. [19] 이것을 제대로 사용하면 적게는 열 배 정도에서 많게는 천 배 이상까지 속도 향상(C의 속도)을 경험할 수 있다. Cython은 이미 작성된 파이썬 코드를 재활용하기 위한 목적이 아니라 C/C++로 작성된 코드를 사용하기 위함이며 기존 파이썬 코드를 그대로 사용할 경우 컴파일은 되지만 유의미한 성능 향상을 얻을 수 없다. C언어 코드를 파이썬 코드 사이에 섞어 넣을 수 있을 정도의 C언어에 대한 지식이 필요하다. 대표적으로 사용된 예시로는 비동기 이벤트 루프인 uvloop가 있다. 본인이 쓴 코드를 다른 사람들이 읽을 수 없게 하는 난독화(Obfuscation)에 이용되기도 한다.
- pybind11
- Numba
7.3. 외부 함수 인터페이스(FFI)[편집]
파이썬에서 C언어와 같은 다른 언어로 작성된 함수를 호출할 수 있도록 한다. 영어로는 FFI(Foreign function interface)다.
하는 일은 CPython의 확장 모듈과 비슷하지만 완전히 다른 개념으로 몇 가지의 차이점들이 존재한다.
- 확장 모듈은 파이썬의 API와 자료형을 사용하고 FFI는 C의 자료형을 사용한다. 예를 들어 list의 모든 요소를 더하는 함수를 작성한 다면 확장 모듈 에서는 list 객체를 그대로 C로 보내어 CPython의 타입(PyListObject*)과 CPython API의 함수(PyList_GetItem)을 통해 list의 요소에 접근한다면 FFI에서는 파이썬에서 C배열을 할당하여 데이터를 복사한 후 C로 포인터를 전달한다.
- 확장 모듈은 별도의 컴파일이 필요하고 FFI는 C 라이브러리를 날것 그대로 사용할 수 있다.
- 확장 모듈은 파이썬 구현체에 독립적이고 FFI 코드는 다른 구현체(PyPy)에서도 사용할 수 있다.
FFI를 이용하여 C함수를 그대로 노출하는 것은 프로그램을 매우 난잡하게 만들 수 있으므로 C타입으로 형변환을 수행하는 Wrapper function이나 C의 포인터를 가지고 있는 Wrapper class를 작성하여 Pythonic한 코드를 작성하는 것이 중요하다.
아래는 FFI 라이브러리이다.
7.4. 기타[편집]
8. 문법[편집]
"display: none; display: 문단=inline"를 참고하십시오.
9. 설치[편집]
2024년 기준 데비안 계열(우분투 등) 경우
sudo apt-get install python3
9.1. 코드 스타일[편집]
파이썬은 PEP 8[21] 을 바탕으로 하는 통일적인 스타일 가이드라인을 제시하고 있어 대부분의 프로젝트에서 일관적인 스타일을 볼 수 있다.
파이썬에서는 작명 규칙이 실제 기능에 영향을 미치지는 않지만 PEP 8에 따른 작명 규칙을 지킴으로써 다른 사용자와 코드를 공유하거나 자신이 나중에 코드를 볼 때 동작을 헷갈리지 않도록 돕는 작명 규칙이 있다. 전체적으로 클래스[22] 는 파스칼 케이스(PascalCase), 나머지 경우[23] 에는 스네이크 케이스를, 상수에는 스크리밍 스네이크 케이스(SCREAMING_SNAKE_CASE)를 사용한다.
또한 파이썬은 내부 속성(private attribute)이라는 개념[24] 이 없기 때문에 맨 앞에 밑줄(_)을 표기하는 경우 내부 변수로 간주하는 관례가 있다.
이 외에도 한 줄은 79글자 이하로 제한[25] 하는 등 다양한 관례가 있다. 자세한 내용을 PEP 8를 참고하자.
작성한 코드가 PEP8 스타일 가이드를 지키는지 확인해 주는 Ruff, Pylint, Flake8, PyRight와 같은 패키지들과 자동으로 코드를 수정해 주는 Black, yapf와 같은 패키지들을 사용해 더욱 쉽게 파이썬의 권장 스타일을 지키며 파이썬 코드를 짤 수 있다.
10. 학습[편집]
파이썬은 인기 있는 주제이기에 관련된 공부 자료가 매우 많다. 이 부분에서 몇 가지 다양한 출처와 방법을 소개하고 있지만, 결국 자신에게 맞는 자료인지 직접 확인하는 것이 가장 중요하다.
10.1. 공식 튜토리얼[편집]
파이썬의 문서는 공식 튜토리얼(영어)(한국어)을 제공하고 있다. 매우 자세하고 잘 쓰여 있으며 다운로드도 가능하기에 활용해보는 것도 좋을 것이다.
10.2. 유튜브[편집]
- 나도코딩: 초보자를 대상으로 한 강의는 370만 이상의 조회수를 기록할 만큼 매우 인기가 좋다. 채널 자체가 파이썬을 타겟으로 다방면인 사용법을 다루기도 하지만, 초보자를 위한 강의도 존재한다.
- 생활코딩: 파이썬을 활용한 웹 서버 개발을 설명한다. 특유의 깔끔하고 비유적인 설명이 초보자에게 좋다. 다만 애초에 채널 자체가 웹 개발을 위주로 설명하는 곳이기 때문에, 파이썬을 이용한 웹 개발만 배울 수 있지 다른 분야에 대한 설명은 없다.
- 조코딩: 점프 투 파이썬 교재를 활용한 강의를 진행한다.
- 윤인성: 혼자 공부하는 파이썬 교재의 무료 강의를 공개했다. 딕션과 말의 빠르기, 책에서 다루지 못한 내용들, 다른 방식으로 했을 경우의 문제점까지 사소한 것부터 대략적인 흐름을 다시 짚어주는 등 강의 퀄리티가 꽤 좋다.
- 임커밋: 파이썬의 여러가지 기능들을 재미있게 설명한다.
10.3. 웹사이트[편집]
- 점프 투 파이썬: 온라인에서도 볼 수 있지만 서적으로도 출간되었다. 시작이 온라인이라 그런지, 질의응답을 잘 해주기로 알려져 있다.
- 왕초보를 위한 Python: 이름 그대로 파이썬의 기본기를 설명해 준다.
- 파이썬으로 배우는 알고리즘 트레이딩: 파이썬을 통한 알고리즘 트레이딩을 배울 수 있다.
- 초보자를 위한 파이썬 300제: 마치 문제집 같은 형식으로 직접 풀면서 연습해 보기 좋다.
- 리브레 위키 프로그래밍 시리즈
10.4. 도서[편집]
- 바로 쓰는 파이썬(기초편): 서울대학교의 일부 강좌에서 학부 수업용 교재로 사용하기 시작하였다.
- Do It! 점프 투 파이썬: 위키독스의 내용을 엮어서 낸 파이썬 입문 서적. 기초적인 내용을 다루며 비전문가가 따라가기 쉽게 되어 있다. 입문서이기 때문에 파이썬에 대해 잘 아는 경우 추천하지는 않는다. 해당 책은 국내에 커뮤니티가 형성(네이버 카페)되어 있어서 질문/답변이 빠르다.
- 밑바닥부터 시작하는 딥러닝: 일본의 사이토 고키가 쓴 "밑바닥부터 시작하는 딥러닝"이라는 책이다. 원서 일본어로 나왔는데, 일본 내에서 사이토 고키가 직접 감수를 맡은 영어판이 같이 나와 이 영어판을 기반으로 미국에서 인기를 끌었다.
- 파이썬 알고리즘 인터뷰: 파이썬으로 알고리즘 문제를 풀이하는 책도 나와 있다. 자료 구조와 알고리즘을 그림으로 도식화해 이해하기 쉽게 설명하고, 카카오 코딩 테스트 기출 문제 포함 주제별 다양한 알고리즘 코딩 테스트 문제를 다양한 각도에서 풀고 있다.
- 혼자 공부하는 파이썬: 일명 혼공파. 비전공자 대상으로 출간된 파이썬 입문서로, 책이 두꺼운 편이지만 친절한 설명되어 있고 예제가 많다. 저자의 유튜브 채널에는 100여개의 무료 강의가 제공되고 있으며, 댓글로 질문을 남기면 저자가 직접 답변을 달아준다.
- 파이썬 코딩 도장: 입문부터 중급자 수준까지의 내용을 담고 있는 책. 동영상 강의가 지원되며, 웹에서 내용을 무료로 볼 수도 있다.
- 모두의 파이썬: 파이썬을 입문 할 때 최고의 책이다. 오류가 날 시 어떻게 할 지 따로 부록에도 있으며, 다양한 예재와 마지막의 게임 만들기까지 입문 시 추천하는 책이다. 다만 중수 이상 부터는 쉽게 느껴 질 수 있다.
11. 여담[편집]
- 귀도 반 로섬은 2013년에 재미있게도 한 헤드헌터로부터 경력직 파이썬 개발자 취업 제안을 받았다고 한다[26] .
- C++, Java와 함께 구글의 3대 개발 언어 중 하나로 알려져 있다.
- 문명 4의 스크립트 언어로 쓰였다. Lua와 더불어 게임 스크립트 언어의 양대 산맥.
- 심즈 4 역시 파이썬을 기반으로 해서 동작한다. 클라이언트를 살짝 보면 수많은 .pyo 파일들의 향연을 볼 수 있다. 심즈 4의 최적화는 나름 우수한 편. 근데 pyo가 3.5 버전에서 삭제되고 pyc로 대체되었다.
- 킹덤 언더 파이어의 엔진에도 쓰였다. 500여 개의 자체 모듈이 누더기처럼 돌아갔다고 한다.
- 월드 오브 탱크는 상당 부분이 파이썬으로 구현되어 있다. 유저가 작성하는 모드도 로직 부분은 파이썬으로 구현된다.
- EVE 온라인은 파이썬의 경량/고속 실행 버전인 Stackless Python으로 작성되었다. 개발사 CCP Games는 파이썬썬 재단의 정식 후원자이기도 하다.
- 터미너스: 좀비 생존자들이라는 국산 좀비 생존 게임도 파이썬으로 구현되어 있다. 개발자가 인터뷰에서 파이썬은 개발 속도가 빠르지만, 코드를 끊임없이 최적화해야 했다고 말했다.
- 코드컴뱃 홈페이지. 파이썬을 게임의 형식을 빌려 배울 수 있는 사이트이다.
- 2014년 8월 30일 파이콘 2014가 PyCon이 한국에서 개최된 것을 시작으로 파이콘 2023까지 개최되었다.
- 2016년에는 PyCon APAC가 한국에서[27] 성공리에 개최되었다.#공식 홈페이지
- 도널드 글로버가 자신의 노래 가사에 파이썬을 배우라는 가사를 넣기도 했다.
- 귀도 반 로섬은 2019년 10월 30일부로 드랍박스에서 나오고 은퇴를 선언하였지만 2020년 11월 13일, 은퇴 생활이 지루하다며 다시 마이크로소프트 의 개발팀에 합류했다[28] .
- 투어라이브의 백엔드 기술의 대부분은 파이썬으로 구현되어 있다.
- 2020년 5월, 3.9부터는 비스타와 7을 지원하지 않는다.
- Chinese Python이라는, 중국어 기반의 언어가 개발되기도 했다.
- 파이썬 모듈중 하나인 tarfile에 사용자의 파일을 멋대로 덮어쓸 수 있는 취약점이 발견되었다. 사실 15년전부터 보안에 문제가 있는 모듈임이 알려져 있었으나 개발자노트에 경고문만 남겨둔채 방치한 결과 깃허브에서만 최소 35만개의 리포지터리가 취약점이 있는 것으로 밝혀졌다.
11.1. 몬티 파이썬의 패러디[편집]
역사에서 설명되었다시피 파이썬은 몬티 파이썬에서 이름을 따왔고, 파이썬 개발자들은 몬티 파이썬을 모르는 개발자들의 이해가 방해되지 않는 선에서 유쾌하게 관련 패러디를 사용한다.
CPython의 공식 GitHub 저장소를 보면 협업 보조용 봇 이름들이 the-knights-who-say-ni(니라고 말하는 기사)나 bedevere(베디비어) 같이 몬티 파이튼의 성배의 배역들이다.
또한 일반적으로 임시로 사용하는 변수명에 foo와 bar를 사용하는 것과 달리 파이썬 커뮤니티나 교재에서는 spam, ham, eggs를 사용하는 경우가 있다. 이도 스팸(몬티 파이튼의 비행 서커스)에 나온 내용을 패러디한 것이다.
PyPI의 코드명인 Cheese Shop도 이와 관련이 있다[29] . 이 흔적은 PyPI의 404 페이지에서 스크롤을 내리면 나오는 숨겨진 이스터에그에서 The Cheese Shop Sketch라는 이름의 유튜브 영상이 임베드되어 있는 것에서 찾을 수 있다.
파이썬에 기본으로 내장되어 있는 프로그램인 IDLE의 정식 약자는 Integrated Development and Learning Environment[30] 로 IDE의 변형이지만, 실제로는 몬티 파이썬의 멤버인 Eric Idle의 이름을 딴 것이다[31] .
트위터에서 Eric Idle에게 Python의 이름의 유래를 알려주자 Idle은 "파이썬이 뭔지는 잘 이해하지 못하지만, 매우 고맙다고 생각한다. 참고로 스팸메일의 유래가 어디서 나왔는지도 생각해 봅시다!"라고 트위터로 쓰자 귀도 반 로섬이 직접 리트윗을 하며 파이썬이 무엇인지 친절히 설명해 주면서 자신은 여전히 Idle의 팬이라고 답했다[32] .